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.
解析
从题意很容易总结出来 f(x,y)=f(x−1,y)+f(x,y−1);
思路一:递归求解
int uniquePaths(int m, int n) {
if(m==1) return 1;
if(n==1) return 1;
return uniquePaths(m-1,n)+uniquePaths(m,n-1);
}
遗憾的是超时了。很容易想到用DP,对于这道题还是很容易转化的。
思路二:DP
int uniquePaths(int m, int n) {
int *fx=(int *)malloc(n*sizeof(int));
memset(fx,0,n*sizeof(int));
fx[0]=1;
for(int i=0;i<m;i++){
for(int j=1;j<n;j++){
fx[j]+=fx[j-1];
}
}
int res = fx[n-1];
free(fx);
return res;
}
思路三:高级DP(参考大神的)
分析
其实,假设用二维数组存储了每个位置的结果。
例如: 对于一个5*6的矩阵,其结果为如下。
1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 |
1 | 3 | 6 | 10 | 15 | 21 |
1 | 4 | 10 | 20 | 35 | 56 |
1 | 5 | 15 | 35 | 70 | 126 |
如果去掉第6列,这是一个对称阵。并且对角线上的的值为其上方的2倍。
代码
int uniquePaths(int m, int n) {
int row =min(m,n);
int col =max(m,n);
int* fx=new int[col];
for(int i=0;i<col;i++){
fx[i]=1;
}
for(int i=1;i<row;i++){
fx[i]*=2;
for(int j=i+1;j<col;j++){
fx[j]+=fx[j-1];
}
}
int res =fx[col-1];
delete[] fx;
return res;
}