我想知道在哪里可以阅读有效解决此问题的算法:
示例,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
此问题可能 与:
相关答案 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;
}