题目:
思路:
思路有俩:一个是动态规划,一个是数学直接算
数学:
可以根据m,n直接算出来,需要走多少步向右,走多少步向左,然后就是有多少种组合的问题。
动态规划:
动态规划的思想比较简单,因为动态规划问题,就是状态的转移问题,考虑当前状态,当前状态表示,走到当前表格需要走的步数,而当前状态依赖于之前的状态,当前状态可以由左面的格子 + 上面的格子得出。
动态规划问题,只需要考虑两个方面:状态的转移,状态数组的初始化。
数学解法:
class Solution {
public:
int uniquePaths(int m, int n) {
int Min = m>n?n-1:m-1;
if(Min == 0)return 1;
int single = Min;
int Max = m>n?m-1:n-1;
long long res = 1;
long long del = 1;
while(Min --){
res *= Max + 1;
Max++;
del *= Min + 1;
}
if(single == 1)return res;
return res/del;
}
};
动态规划:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> res(2,vector<int>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0){
res[0][j]=1;
}else{
if(i & 1){
res[1][j] = res[0][j] ;
if(j>=1){
res[1][j] += res[1][j-1];
}
}else{
res[0][j] = res[1][j] ;
if(j>=1){
res[0][j] += res[0][j-1];
}
}
}
}
}
if((m-1)&1){
return res[1][n-1];
}
return res[0][n-1];
}
};