70.爬楼梯
看完题后的思路
- dp【i】 爬到第i阶的方法数
- dp【i】=dp【i-1】+dp【i-2
- 初始化 dp【0】1dp【1】=1
- 从左到右
- 模拟
代码
746爬楼梯最小花费
看完题目后思路
最终要到达length阶
- dp【i】 到达第i阶的最小花费
- dp【i】=dp【i-1】+cost【i-1】,dp【i-2】+cost【i-2】 最小值
- 初始化 dp【0】=0 dp【1】=0
- 从左到右
- 模拟
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length+1];
dp[0]=0;dp[1]=0;
for (int i = 2; i <=cost.length ; i++) {
dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[cost.length];
}
}
● 62.不同路径
看完题后的思路
- dp【i】【j】到达i,j的不同路径的个数
- 递推公式
dp【i】【j】=dp【i-1】【j】+dp【i】【j-1】 - 初始化
dp【0】【i】=1;dp【i】【0】=1;
代码
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 i = 0; i < n; i++) {
dp[0][i]=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];
}
}
复杂度
0(m*n)
收获
三刷过
63. 不同路径 II
看完题后的思路
- dp【i】【j】到达i,j的不同路径的个数
- 递推公式
if(i,j处有石头){
dp【i】【j】=0;
}else{
dp【i】【j】=dp【i-1】【j】+dp【i】【j-1】
} - 初始化
第一行从0开始,如果没有石头为0,有石头,该处以及它的后面全为0,列同理 - 顺序
从上到下,从左到右 - 略
代码
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
if (obstacleGrid[i][0]!=1){
dp[i][0]=1;
}else {
break;
}
}
for (int i = 0; i < n; i++) {
if (obstacleGrid[0][i]!=1){
dp[0][i]=1;
}else {
break;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j]==1){
dp[i][j]=0;
}else {
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
收获
- 动态规划中,如何优化空间
(1)当是一维数组的时候
dp【i】=op(dp【i-1】) ====》 dp=op(dp) 前一个dp是第n次的,后一个是第n-1次的,相当于dp【i-1】
(2)当是二维数组的时候