和20題一樣的思路link
題解:
class Solution {
public:int dfs(int i,int j,vector<vector<int>>&memo){//超過了邊界,return 0if(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);}
};
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];}
};