剑指 Offer II 098. 路径的数目
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
解题方法1 动态规划
1、思路:计数型动态规划
2、算法
- (1) 确定状态:f[i][j]:机器人有多少种从左上角方式走到(i,j)
- 最后一步:
机器人无论用何种方式到达右下角,总有最后挪动的一步(向下或向右) - 化成子问题:
机器人有多少种方式从左上角走到(m-2,n-1)和(m-1,n-2)
- 最后一步:
- (2) 转移方程:f[m][n] = f[m-2][n-1]+f[m-1][n-2]
- (3) 初始条件和边界情况
- 初始条件:f[0[]0]=1,因为机器人只有一种方式到左上角
- 边界情况:i=0或j=0,则前一步只能有一个方向过来→f[i][j]=1
- (4) 计算顺序:
- 第0行 f[0][0]、f[0][1]…f[0][n-1]
- 第1行 f[1][0]、f[1][1]…f[1][n-1]
- 第m-1行 f[m-1][0]、f[m-1][1]…f[m-1][n-1]
3、java代码
class Solution {
public int uniquePaths(int m, int n) {
//f[i][j]:机器人有多少种从左上角方式走到(i,j)
int[][] f=new int[m][n];
//循环计算 f[0][0]、f[0][1]…f[0][n-1]......f[m-1][0]、f[m-1][1]…f[m-1][n-1]
//row: Top to Bottom
for(int i=0;i<m;i++){
//column: Left to Right
for(int j=0;j<n;j++){ //修改 把j写错成i
//当row为0或者column为0时:f[0][j]=1、f[i][0]=1
if(i==0||j==0){ //修改:或运算|| 写错为 与运算&&
f[i][j]=1;
}else{
f[i][j]=f[i-1][j]+f[i][j-1]; //修改:转换方程为:f[m][n] = f[m-2][n-1]+f[m-1][n-2];
//实际数组下标表示为:f[i][j]=f[i-1][j]+f[i][j-1];
}
}
}
return f[m-1][n-1];
}
}