一、动态规划理论基础
动态规划五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
二、509 斐波那契数
1. 题目链接:力扣
2. 思路:按动规五部曲走,思路见代码
3. 代码:
var fib = function(n) {
// 1.dp数组与下标的含义:dp[i]是存放第i个斐波那契数的
// 2.状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]
// 3.初始化:dp[0] = 0,dp[1] = 1
// 4.遍历顺序:dp[i]依赖于前两个值,那么从前向后遍历
// 5.举例推导dp数组
var dp = [];
dp[0] = 0;
dp[1] = 1;
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
};
三、70 爬楼梯
1. 题目链接:力扣
2. 思路:dp[i]是爬i层楼梯的方法数,dp[i] = dp[i - 1] + dp[i - 2],dp[0] = 0,dp[1] = 1, dp[2] = 2
3. 代码:
var climbStairs = function(n) {
var dp = [];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for (let i=3; i<=n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
};
四、746 使用最小花费爬楼梯
1. 题目链接:力扣
2. 思路:dp[i]指的是到达第i级台阶花费的最小体力,dp[i] = min(dp[i - 1]+cost[i - 1], dp[i - 2]+cost[i - 2],初始化时,跳到第0级和第1级都是可以直接开始的,因此dp[0]和dp[1]都是0。
3. 代码:
var minCostClimbingStairs = function(cost) {
var dp = [];
dp[0] = 0;
dp[1] = 0;
var n = cost.length;
for (let i=2; i<=n; i++) {
var num1 = dp[i - 2] + cost[i - 2];
var num2 = dp[i - 1] + cost[i - 1];
dp[i] = num1 < num2 ? num1 : num2;
}
return dp[n];
};
总结:今日学习时长1h左右,目前还比较简单