题目要求:
分析:
这是一道很经典的DP算法题,去年帮我同学笔试的时候就遇到过。
其实第一反应是动态规划,但是复杂度太高了。
关于递归与动态规划的分析,可以参照这位大神的博客:递归做法与动态规划做法的分析和比较
回到这道题目。
我们想要求其能够到达终点的所有路径,而且它的走法只能是往右或者往下,那么我们就把问题给拆分开来看。
对于上图中红笔写的“当前位置”来说,与其有关的就只有它的上面和左边。假设当前位置的坐标为dp[i][j],那么到达它路径的条数就是dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。
好了,到这里,这个问题其实已经解决了,但是,还有两个特殊的边界情况得考虑:
当只有一行时,它只能往右走;
当只有一列时,它只能往下走。
这两种情况下,走法都只有一种。
具体代码如下:
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for(int i = 0; i < m; i ++) {
for(int j = 0; j < n; j ++) {
if(i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
}