[leetcode] 62. 不同路径
我们直接用递归来模拟
class Solution {
public static int cnt;
public int uniquePaths(int m, int n) {
cnt = 0;
dfs(1, 1, m, n);
return cnt;
}
public void dfs(int i, int j, int m, int n) {
if (i == m && j == n) {
cnt++;
return;
}
if ((j + 1) <= n)
dfs(i, j + 1, m, n);
if ((i + 1) <= m)
dfs(i + 1, j, m, n);
}
}
好吧,果然超时了
超在哪了,有些格子做了重复性计算。
其实我们用动态规划来做就简单了:
倒着想,既然机器人只能往右或者往下走,假设机器人已经走到了(i,j),那么机器人只会从左方或者右方走过来的
我们用f[i][j]来描述机器人走到(i,j)的路径数
显然,状态转移方程为:f[i][j] = f[i-1][j]+f[i][j-1]
初始条件是多少呢?当ij1时,显然路径数就1个,所有初始条件是f[0][0]=1
最终结果是:f[m-1][n-1]
class Solution {
public int uniquePaths(int m, int n) {
int[][] f = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
f[i][j] = 1;
}
if (i - 1 >= 0) {
f[i][j] += f[i - 1][j];
}
if (j - 1 >= 0) {
f[i][j] += f[i][j - 1];
}
}
}
return f[m - 1][n - 1];
}
}