动态规划五部曲:
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
509. 斐波那契数
代码:
class Solution { //509. 斐波那契数
//1. 确定dp数组以及下标的含义: dp[i]为第i个数的斐波那契数列是dp[i]
//2. 确定递推公式:dp[i]=dp[i-1]+dp[i-2];
//3. dp数组如何初始化:dp[0]=0,dp[1]=1
//4. 确定遍历顺序:dp[i]依赖dp[i-1]和dp[i-2],所以是从前往后遍历的
//5. 举例推导dp数组: n=10时,数列为0,1,1,2,3,5,8,13,21,34,55
public:
int fib(int n) {
if (n <= 1)return n;
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) { // 注意i是从2开始的
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
70. 爬楼梯
代码:
class Solution { //70. 爬楼梯
public:
//1. 确定dp数组以及下标的含义: dp[i]为爬到第i个层台阶有dp[i]种方法
//2. 确定递推公式:爬到第i层台阶可以从第i-1层台阶跳一步上去,也可以从第i-2层台阶跳两步上去,所以 dp[i]=dp[i-1]+dp[i-2];
//3. dp数组如何初始化:dp[1]=1,dp[2]=2
//4. 确定遍历顺序:dp[i]依赖dp[i-1]和dp[i-2],所以是从前往后遍历的
//5. 举例推导dp数组: n=5时,数列为1,2,3,5,8
int climbStairs(int n) {
if (n <= 1)return n;
vector<int> dp(n+1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) { // 注意i是从3开始的
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};