Day32| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
509. 斐波那契数
动态规划五部曲:
- 确定dp数组以及下标含义
- 第i个数的斐波那契数列是dp[i]
- 确定递推公式
- 状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
- dp数组如何初始化
- dp[0] = 0; dp[1] = 1;
- 确定遍历顺序
- dp[i]是依赖 dp[i - 1] 和 dp[i - 2]→遍历的顺序一定是从前到后遍历的
- 举例推导dp数组
public class Solution {public int Fib(int n) {if(n<2) return n;// 用长度为2的数组保存前两个结果,节省空间int[] dp=new int[2]{0,1};// 从 2 开始迭代直到 nfor(int i=2;i<=n;i++){// 滚动数组:前一项变成现在的后一项int temp=dp[0]+dp[1];dp[0]=dp[1];dp[1]=temp;}// 返回第 n 项(最终保存在 dp[1] 中)return dp[1];}
}
70. 爬楼梯(写法与上题相同)
动态规划五部曲:
- 确定dp数组以及下标含义
- 达到i阶有dp[i]种方法
- 确定递推公式
- 状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
- dp数组如何初始化
- dp[1] = 1; dp[2] = 2;
- 确定遍历顺序
- dp[i]是依赖 dp[i - 1] 和 dp[i - 2]→遍历的顺序一定是从前到后遍历的
- 举例推导dp数组
public class Solution {public int ClimbStairs(int n) {if(n<=2) return n;int[] dp=new int[2]{1,2};for(int i=3;i<=n;i++){int temp=dp[0]+dp[1];dp[0]=dp[1];dp[1]=temp;}return dp[1];}
}
746. 使用最小花费爬楼梯
可以选择爬 1 或 2 个台阶,可以从下标 0
或 1
开始爬
动态规划五部曲:
- 确定dp数组以及下标含义
- 到达第i台阶所花费的最少体力为dp[i]。
- 确定递推公式
状态转移方程
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]
- dp数组如何初始化
- dp[0] = 0; / dp[1] = 0;
- 确定遍历顺序
- dp[i]是依赖 dp[i - 1] 和 dp[i - 2]→从前到后遍历cost数组
- 举例推导dp数组
public class Solution {public int MinCostClimbingStairs(int[] cost) {int[] dp=new int[2]{0,0};for(int i=2;i<=cost.Length;i++){int temp=Math.Min((dp[1]+cost[i-1]),(dp[0]+cost[i-2]));dp[0]=dp[1];dp[1]=temp;}return dp[1];}
}