
和20题一样的思路link
题解:
cpp
class Solution {
public:
int dfs(int i,int j,vector<vector<int>>&memo){
//超过了边界,return 0
if(i<0||j<0){
return 0;
}
//从(0,0)到(0,0)只有一条路
if(i==0&&j==0){
return 1;
}
int &res=memo[i][j];//看之前有没有走过
if(res){
return res;//如果走过
}
return res=dfs(i-1,j,memo)+dfs(i,j-1,memo);
}
int uniquePaths(int m, int n) {
vector memo(m,vector<int>(n));//用m行n列的数组存位置状态
return dfs(m-1,n-1,memo);
}
};
cpp
class Solution {
public:
int uniquePaths(int m, int n) {
//dp[i][j]=dp[i-1][j]+dp[i][j-1]
//即:dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]
vector dp(m+1,vector<int>(n+1));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0){
dp[1][1]=1;//其实看成左上角顶点是(1,1),只有1种方法走到
}else{
dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j];//假设i=0,j=1,dp[1][2]=dp[0][2]+dp[1][1]
//这个时候其实是要走到顶点处下面一格,那么很容易知道dp[0][j]和dp[i][0]都必须是0
//因为超过边界了,我们在初始化dp数组的时候,dp数组全是0,所以已经包含了以上
}
}
}
return dp[m][n];
}
};