动态规划基础
动态规划题目类型
- 动规基础题
- 背包问题
- 打家劫舍
- 股票问题
- 子序列问题
动规5部曲
- dp数组定义以及下标含义
- 递推公式
- dp数组初始化
- 遍历顺序
- 打印dp数组查找问题
509. 斐波那契数
按照五部曲进行分析:
- dp数组的含义是dp[i]就是F(i)
- dp[i] = dp[i - 1] + dp[i - 2]
- dp[0]=0,dp[1]=1
- 从前向后遍历
class Solution {
public:
int fib(int n) {
vector<int> dp(n + 1);
if (n == 0)
return 0;
if (n == 1)
return 1;
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
70. 爬楼梯
动态规划的题目要去找递推函数,其实就是找规律。可以发现本题的规律就是斐波那契数列。
- dp[i]含义是爬到第i级台阶有多少种方法
- 递推函数:dp[i] = dp[i - 1] + dp[i - 2]。爬到第i阶只要从i-1爬一级或i-2爬两级
- dp初始化,dp[1]=1,dp[2]=2
- 遍历顺序:从前向后
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n + 1);
if (n == 1)
return 1;
if (n == 2)
return 2;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
746. 使用最小花费爬楼梯
- dp[i]含义是到达第i层台阶要花费多少,i的取值范围是[0, n],其中n就是楼顶
- 递推函数:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
- dp初始化,dp[0]=0,dp[1]=0
- 遍历顺序:从前向后
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n + 1, 0);
for (int i = 2; i < n + 1; ++i) {
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[n];
}
};