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

时间:2014-05-05 23:50:48

标签: optimization matrix path sum max

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

  • 允许四个方向:上,下,左,右
  • 无法访问包含零的单元格。
  • 两次访问同一个单元格是非法的。
  • 围绕边缘移动包裹:
  • (第一行与最后一行连接)
  • (第一个col与最后一个col连接)

示例,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

此问题可能 与:

相关
  • 查找最大子矩阵
  • 动态编程

3 个答案:

答案 0 :(得分:2)

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

你问题中的问题实例在一台3岁的i5笔记本电脑上解决了0.231秒,在ideone.com上解决了半秒钟。我在这里提供了代码http://ideone.com/5kOyxq(请注意,由于我输入数据的方式,'up'和'down'被颠倒了。

对于不太饱和的问题,您可能需要添加Bound / Cut方法。您可以按如下方式生成Bound:

首先,遍历NxN矩阵并收集K个最高值元素(可以在N²logK中完成)并按max-first排序。然后,累积地计算值UB [t] = SUM [i :: 0-> t] SortedElements [i]。因此,任何t长度路径的UB为UB [t](最大t个元素)。

在步骤T,当前分支的UB是UB [t]。如果ValueSoFar [T] + UB [K-T]< = BestPathValue,则可以停止该分支。

可能有更好的方法,但这对于合理大小的矩阵和路径长度来说应该足够了。

答案 1 :(得分:0)

游戏或谜题。给定矩阵,步数和总和,找到路径。 如果有一个真实世界的应用程序,这将是很好的,但我还没有找到它。 游戏往往会烧伤"年轻人的大脑知识,那么为什么不加入有用的东西,比如加成?

答案 2 :(得分:0)

#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;
}