✅做题思路or感想
乍一看是一道图论题(实际上也可以用图论),但是可以用动态规划来解的题。
dp数组的含义
- 求什么就设什么。
dp[i][j]
是到达坐标(i, j)
的不同路径数
递推公式
- 到达
(i, j)
的路径可以是从(i - 1, j)
来,也可以是从(i, j - 1)
来,题目求的是方法数,故这里就直接二者相加就好了。dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
初始化
- 这一题的坑点在于初始化。最上面一整行和最左边一整列的路径数都是1(因为只能无脑往左或者无脑往下),所以这里初始化要初始化最上面一行和最左边一列为1
遍历顺序
- 因为从递推公式知道,后来的值是由前面的值推出,故从小到大
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[150][150];
//初始化
for (int i = 0; i < n; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < m; j++) {
dp[0][j] = 1;
}
//注意这里是i = 1, j = 1开始
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[n - 1][m - 1];
}
};