*LeetCode 62. Unique Paths 记忆化搜索 or 组合数学

https://leetcode.com/problems/unique-paths/


记忆化搜索的本质就是dp, 但是涉及图的时候 有时候思考会更顺一些


const int SIZE = 101;

class Solution {
public:
    int uniquePaths(int m, int n) {
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++)
                dp[i][j] = -1;
        }
        return dfs(0,0, m, n);
    }
    int dfs(int hang, int lie, int m, int n) {
        if(dp[hang][lie] >= 0 )return dp[hang][lie];
        if(hang == m-1 && lie == n-1) return (dp[m-1][n-1]=1);
        int ret = 0;
        if(hang+1 < m) ret += dfs(hang+1,lie, m, n);
        if(lie+1 < n) ret += dfs(hang, lie+1, m, n);
        return (dp[hang][lie]=ret);
    }
private :
    int dp[SIZE][SIZE];
};


当然也可以dp:逆向思维

const int SIZE = 101;
class Solution {
public:
    int uniquePaths(int m, int n) {
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++) {
                if(i == 0 && j == 0) dp[i][j] =1;
                else {
                    dp[i][j] = 0;
                    if(i-1 >=0) dp[i][j] += dp[i-1][j];
                    if(j-1>=0) dp[i][j] += dp[i][j-1];
                }
            }
        return dp[m-1][n-1];
    }
private :
    int dp[SIZE][SIZE];
};

组合数学的方法,高中数学题,其实正常来算也是O(n^2)使用

C(M-1,N-1)+C(M-1,N)=C(M,N)


也可以这样http://www.bubuko.com/infodetail-911131.html


你可能感兴趣的:(*LeetCode 62. Unique Paths 记忆化搜索 or 组合数学)