Unique Paths
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> map(m+1);
for(int i=0;i<=m;i++)map[i].assign(n+1,1);
for(int i=2;i<=m;i++){
for(int j=2;j<=n;j++){
map[i][j]=map[i-1][j]+map[i][j-1];
}
}
return map[m][n];
}
};
深搜超时,用备忘录法
class Solution {
public:
int uniquePaths(int m, int n) {
f=vector<vector<int>>(m+1,vector<int>(n+1,-1));
return dfs(m,n);
}
private:
vector<vector<int>> f;
int dfs(int x,int y){
if(x<1||y<1)return 0;
if(x==1&&y==1)return 1;
if(f[x][y]>-1)return f[x][y];
f[x][y] = dfs(x-1,y)+dfs(x,y-1);
return f[x][y];
}
};
数学公式:
m行n列矩阵,机器人从左上走到右下共需要步数m+n-2,其中向下走的是m-1,因此问题变成了在m+n-2个操作中,选择m-1个时间点向下走,选择方式有多少种,即
C_m+n-2^m-1
class Solution {
public:
typedef long long int64_t;
static int64_t factor(int n,int start=1){
int64_t ret=1;
for(int i=start;i<=n;++i)
ret*=i;
return ret;
}
//求C_n^k
static int64_t combination(int n,int k){
if(k==0)return 1;
if(k==1)return n;
int64_t ret=factor(n,k+1);
ret/=factor(n-k);
return ret;
}
int uniquePaths(int m, int n) {
//max可以防止n和k差距过大
return combination(m+n-2,max(m-1,n-1));
}
};