领扣114 · 不同的路径
描述
有一个机器人的位于一个 m × nm×n 个网格左上角。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。
问有多少条不同的路径?
n和m均不超过100
且答案保证在32位整数可表示范围内。
【分析题目】
一个棋子从左上角(0,0)按照从向下或者向右的方向,到达右下角(m,n)
【解题思路】
【动态规划】
【1、确定状态】
1)最后一步一定从左边(i,j-1)过来,或者上边(i-1,j)过来,
2)状态f[i][j]表示从左上角有多少种方式 走到(i,j),
3)坐标型动态规划:数组下标[i][j]即坐标(i,j)
4)化成子问题:状态f(X)=用多少枚硬币能拼出子问题X
【2、状态转移方程】
f[i][j] = f[i][j-1] + f[i-1][j];
【3、初始条件和边界条件】
初始条件:f[i][j] = 0
边界条件:
当i = 0 f[i][j] = 1
当j = 0 f[i][j] = 1
其他 f[i][j] = f[i-1][j] + f[i][j-1];
【4、计算顺序】
从小到大
【代码】
// public int uniquePaths(int m, int n) {
// int[][] f = new int[m][n];
// f[0][0] = 1;
// for (int i = 0; i < m; i++) {
// for (int j = 0; j < n; j++) {
// if (i == 0 && j == 0) {
// f[i][j] = 1;
// }
// if (j - 1 >= 0)
// f[i][j] += f[i][j - 1];
// if (i - 1 >= 0)
// f[i][j] += f[i - 1][j];
// }
// }
// return f[m - 1][n - 1];
}
`
public int uniquePaths(int m, int n) {
if(m == 1 || n == 1)
return 1;
double row = 1;
double col = 1;
for(int i = 1;i <= m-1;i++)
row *= i;
for(int i = n; i <= m+n-2; i++)
col *= i;
int result = (int)Math.round(col / row);
return result;
}
【总结】
动态规划的边界是弱点