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