通过回溯解决唯一路径的快速算法

时间:2019-04-29 05:35:29

标签: algorithm dynamic-programming probability combinatorics

  

位于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的东西。

RedditWikipediaYoutube的资源说明了此问题的复杂性。但是他们没有任何答案。

1 个答案:

答案 0 :(得分:1)

不能使用动态编程解决问题,因为递归关系不会将问题分解为子问题。动态编程假定要计算的状态仅取决于循环中的子状态。在这种情况下,这是不正确的,因为可能存在循环。向上和向下。

此问题的一般情况为计算有向循环图中的简单路径数,被认为是#P-Complete

这也可以像枚举二维self avoiding walks一样。根据维基百科,

  

推测这样的路径数被认为是NP难题[sup> [需要引用] 。

但是,如果我们仅考虑朝正方向移动,即。左右,它有一个 m + n C m 的封闭形式的解决方案。基本上,总移动次数始终固定为m + n,其中mn是到对角线终点的笛卡尔距离,我们只需要选择{{1} }权或m降。动态编程解决方案本质上是相同的。