Optimization 在具有正整数的2D矩阵中查找路径中的最大和

Optimization 在具有正整数的2D矩阵中查找路径中的最大和,optimization,matrix,path,sum,max,Optimization,Matrix,Path,Sum,Max,我想知道我在哪里可以读到有效解决此问题的算法: 允许四个方向:上、下、左、右 无法访问包含零的单元格 两次访问同一牢房是非法的 围绕边移动换行: (第一行与最后一行相连) (第一列与最后一列相连) 示例5x5和5个步骤: 9 1 3 1 9 6 3 2 4 1 0 7 * 7 7 5 4 9 4 9 7 9 1 5 5 起点:* 解决方案:向下,向左,向下,向左,向下。即9+4+9+7+9=38 [9] 1 3 1 9

我想知道我在哪里可以读到有效解决此问题的算法:

  • 允许四个方向:上、下、左、右
  • 无法访问包含零的单元格
  • 两次访问同一牢房是非法的
  • 围绕边移动换行:
  • (第一行与最后一行相连)
  • (第一列与最后一列相连)
示例5x5和5个步骤:

  9  1  3  1  9
  6  3  2  4  1
  0  7  *  7  7
  5  4  9  4  9
  7  9  1  5  5
起点:*

解决方案:向下,向左,向下,向左,向下。即9+4+9+7+9=38

 [9] 1  3  1  9
  6  3  2  4  1
  0  7  *  7  7
  5 [4][9] 4  9
 [7][9] 1  5  5
此问题可能与以下方面无关:

  • 求最大子矩阵
  • 动态规划

您在评论中指定需要一种亚秒级的方法,从5x5矩阵中找到最佳值20步路径。我已经实现了一个基本的递归搜索树。最终,这个问题的难度仍然是O(3^k),但像您这样的高度饱和的情况(访问的24个允许节点中有21个)将解决得更快,因为问题简化为“跳过n*n-z-k-1最小值单元”(在这种情况下,n=5、z=1和k+1=21;获胜路径跳过三个1)

您问题中的问题实例在3年前的i5笔记本电脑上只需0.231秒,在ideone.com上只需半秒。我在这里提供了代码(请注意,“
up
”和“
down
”是反向的,因为我输入数据的方式不同)

对于饱和程度较低的问题,可能需要添加绑定/剪切方法。您可以按如下方式生成绑定:

首先,运行NxN矩阵并收集K个最高值元素(可以在N²log K中完成),然后按max First对它们进行排序。然后,累积计算值UB[t]=SUM[i::0->t]SortedElements[i]。因此,任何t长度路径都有UB[t](最大t个元素)的UB


在步骤T,当前分支的UB是UB[T]。如果值为[T]+UB[K-T]游戏或谜题。给定一个矩阵、步数和一个和,找到路径。 如果有一个真实的应用程序,那就太好了,但我还没有找到它。 游戏往往会在年轻人的大脑中“燃烧”知识,所以为什么不燃烧一些有用的东西,比如加法呢
#include<iostream>
#include<climits>
#define R 3
#define C 3

int MAX(int x, int y, int z);

int Max_Cost(int cost[R][C], int m, int n)
{
   if (n < 0 || m < 0)
      return INT_MIN;

   else if (m == 0 && n == 0)
      return cost[m][n];

   else
      return cost[m][n] + MIN( Max_Cost(cost, m-1, n-1),
                               Max_Cost(cost, m-1, n), 
                               Max_Cost(cost, m, n-1)
                             );
}

int MAX(int x, int y, int z)
{
  return max(max(x, y), z);
}

int main()
{
  int cost[R][C] = { {3, 2, 5},
                     {5, 8, 2},
                     {9, 7, 1}
                   };
  cout<<Max_Cost(cost, 2, 1);

  return 0;
} 
#包括 #定义R3 #定义c3 int MAX(int x,int y,int z); 整数最大成本(整数成本[R][C],整数m,整数n) { if(n<0 | | m<0) 返回INT_MIN; else如果(m==0&&n==0) 退货成本[m][n]; 其他的 退货成本[m][n]+最低(最高成本(成本,m-1,n-1), 最大成本(成本,m-1,n), 最大成本(成本,m,n-1) ); } 最大整数(整数x,整数y,整数z) { 返回最大值(最大值(x,y),z); } int main() { int cost[R][C]={{3,2,5}, {5, 8, 2}, {9, 7, 1} };
请澄清一下,路径长度“k”是一个输入参数?是的,路径长度是一个输入参数。总和和路径是输出参数。矩阵大小n和路径长度k之间有关系吗?我认为在kn的情况大不相同。我还没有找到解决方案,但我觉得问题可能是be转化为图问题(顶点=非0矩阵元素,边=任何U/D/L/R非0对)用类似背包问题的边界处理分支和边界。从2条路径开始,按当前值或势的顺序展开它们。k+z必须小于n*n,z是零的数目。谢谢你的解决方案。我得到的比我预期的多得多!我们使用相同的算法,尽管不同的语言。啊,太糟糕了我无法为您提供新的见解。切换到更快的语言是一种选择,还是您需要额外的性能?我可能会用C重写优化器,并从Ruby调用它。另一种可能是在一秒钟后停止搜索,并使用找到的,即使这不是最佳解决方案。我可以问一下应用程序是什么吗?请为您的答案提供更多信息。代码似乎没有访问正方形2,2。也没有包装。没有向四个方向分叉。虽然我没有运行它。虽然此代码片段可能解决问题,但确实有助于提高您的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。