题目描述
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?
Note: m and n will be at most 100.
大概意思是,从左上角走到右下角,一共有多少条路径,每次只能右移或者下移
思路分析
这是一道典型的dp,由于每次只能右移或者下移。所以对于除位于第一行和第一列的任意顶点,从左上角顶点(开始顶点)到达这个顶点的路径数量等于到达它左边的顶点路径数量加上到达它上面的顶点路径数量的和。而对于第一排的顶点,由于不可能向下移到达这一排,所以从开始顶点到第一排的所有顶点的路径只有一条。同理对于从开始顶点到第一列的任意顶点都只有一条路径。所以我们只要从左上角向右下角扫过去就能计算出开始顶点到达结束顶点的路径一共有多少条了。如图所示
解题方案
我们用一个m*n的二维数组数组来记录从开始顶点到达某一顶点[i,j]的路径数量。
所以有 :
a[i,j]=a[i-1][j]+a[i]+a[j-1] , (i>0,j>0)
a[i,j]=1 , (i== 0 || j==0)
C语言答案
int uniquePaths(int m, int n) {
if(n==0 || m==0)
return 0;
if(n==1 || m==1)
return 1;
int a[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if( i==0 || j==0){
a[i][j] = 1;
}else{
a[i][j] = a[i-1][j] + a[i][j-1];
}
}
}
return a[m-1][n-1];
}
其实我们可以继续优化。
优化
上面的代码中,我们使用了二维数组来记录每个开始顶点到[i,j]顶点的路径数量。但是,在两层循环遍历里面,我们是一层一层的遍历的。所以,每次循环只用到了a数组的上一层。所以我们可以只用一维数组来记录就可以了
int uniquePaths(int m, int n) {
if(n==0 || m==0)
return 0;
if(n==1 || m==1)
return 1;
int a[n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if( i==0|| j==0){
a[j] = 1;
} else{
a[j] = a[j] + a[j-1];
}
}
}
return a[n-1];
}