位于XxX网格左上角的机器人正试图到达右下角。机器人可以上下左右移动,但不能两次访问同一位置。右下角有多少个可能的唯一路径?
什么是快速算法解决方案?我花了很多时间试图找出一种快速的算法。但是仍然卡住了。
除回溯外,这基本上是unique paths Leetcode problem。
没有回溯的唯一路径可以通过动态编程来解决,例如:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> cur(n, 1);
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
cur[j] += cur[j - 1];
}
}
return cur[n - 1];
}
};
除了动态回溯以外,使用动态编程到唯一路径的快速算法解决方案是什么?可以快速找到10X10网格的结果1,568,758,030,464,750,013,214,100的东西。
答案 0 :(得分:1)
不能使用动态编程解决问题,因为递归关系不会将问题分解为子问题。动态编程假定要计算的状态仅取决于循环中的子状态。在这种情况下,这是不正确的,因为可能存在循环。向上和向下。
此问题的一般情况为计算有向循环图中的简单路径数,被认为是#P-Complete。
这也可以像枚举二维self avoiding walks一样。根据维基百科,
推测这样的路径数被认为是NP难题[sup> [需要引用] 。
但是,如果我们仅考虑朝正方向移动,即。左右,它有一个 m + n C m 的封闭形式的解决方案。基本上,总移动次数始终固定为m + n
,其中m
,n
是到对角线终点的笛卡尔距离,我们只需要选择{{1} }权或m
降。动态编程解决方案本质上是相同的。