目录
前沿:撰写博客的目的是为了再刷时回顾和进一步完善,其次才是以教为学,所以如果有些博客写的较简陋,是为了保持进度不得已而为之,还请大家多多见谅。
预:看到题目后的思路和实现的代码。
见:参考答案展示。
感思:对比答案后的思考,与之前做过的题目是否有关联。
行:
(1)对于没做出来的题目,阅读答案后重新做一遍;
(2)下次做题可以尝试改善的方向;
(3)有助于理解的相关的题目
优先级:做题进度>学习&总结>默写回顾>做题数量
题目回顾
动态规划五步法:
- 确定dp数组以及下标的含义
确定递推公式
dp数组如何初始化
确定遍历顺序
举例推导dp数组
1.不同路径
题目链接:62.不同路径
思路:动态规划五步法
- dp[m][n]表示第m行第n列位置的路径数
- 每个位置都只能通过左边和上边达到,所以dp[m][n] = dp[m][n-1]+dp[m-1][n]
- dp[0][i]和dp[i][0]这行和列的每个点初始值均为1,因为题目只能向下或右移动。
- 遍历顺序得从前向后推导才能计算出dp[m][n]的路径数
- 举例推导dp数组
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for(int i = 0;i < m;i++){
dp[i][0] = 1;
}
for(int j = 0;j < n;j++){
dp[0][j] = 1;
}
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
2.不同路径 II
题目链接:63. 不同路径 II
思路:动态规划五步法
- dp[m][n]表示第m行第n列位置的路径数
- 每个位置都只能通过左边和上边达到,所以dp[m][n] = dp[m][n-1]+dp[m-1][n]
- 当某点为障碍时,则该点值为0。
- dp[0][i]和dp[i][0]这行和列的每个点初始值均为1,因为题目只能向下或右移动。
- 遍历顺序得从前向后推导才能计算出dp[m][n]的路径数
- 举例推导dp数组
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] result = new int[m][n];
for(int i = 0;i < m;i++){
if(obstacleGrid[i][0] != 1){
result[i][0] = 1;
}else{
break;
}
}
for(int i = 0;i < n;i++){
if(obstacleGrid[0][i] != 1){
result[0][i] = 1;
}else{
break;
}
}
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
if(obstacleGrid[i][j] != 1){
result[i][j] = result[i-1][j]+result[i][j-1];
}
}
}
return result[m-1][n-1];
}
}
总结
动态规划初始化,并不需要全部都初始化,只要能刚开始迭代时需要的值初始化即可,并且这样的值都是具有较明显的特点,就像这道题的两边初始化都为1一样。