首先想到的是回朔法hhh,结果超时了,思路应该是没有错的
class Solution {
public:
void dfs(int m,int n,int startm,int startn,int &count)
{
if(startm<1 || startn<1 || startm>m || startn>n) //判断是否越界
return ;
dfs(m,n,startm+1,startn,count); //向下移动
dfs(m,n,startm,startn+1,count); //向右移动
if(startm == m && startn == n) //到达终点+1
count++;
}
int uniquePaths(int m, int n) {
int count=0;
dfs(m,n,1,1,count);
return count;
}
};
使用动态规划的话,要使用dp数组,并且dp[i][j] =dp[i-1][j]+dp[i][j-1],当前格子等于上一个和左边格子的值和,因为只能向下移动或者向右移动。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int> >dp(m,vector<int>(n,1)); //dp数组初始化
for(int i =0;i<m;i++) { //双层循环给dp赋值
for(int j=0;j<n;j++) {
if( i == 0 || j == 0) //边界为1
continue;
else
dp[i][j] =dp[i-1][j]+dp[i][j-1]; //上一个格子和左一个格子的值之和
}
}
return dp[m-1][n-1]; //返回dp数组的最后一个数
}
};