注意点:
1.主要就是动态规划的五部曲
2.vector也是nums.size()-1;(末尾必须减1)
class Solution {
public:
int fib(int n) {
if(n <= 1) return n;
//1. 确定dp数组以及下标的含义
// dp[i]的含义:第i个数的斐波那契数的值是dp[i]
vector<int> dp(n+1);
// 3.dp数组初始化
dp[0] = 0;
dp[1] = 1;
//4. 确定遍历循环顺序
for(int i = 2; i <= n; i++) {
// 2.确定递推公式
dp[i] = dp[i-2] + dp[i-1];
}
return dp[n];
}
};
注意点:
1.对于dp[0]=1?是因为递归公式中 dp[i] = dp[i-1] + dp[i-2];当i=2的时候,需要dp[0]=1,才符合整体的递归顺序
2.因为步数是1或者2,所以dp[i]的数值就是dp[i] = dp[i-1] + dp[i-2]
class Solution {
public:
int climbStairs(int n) {
if(n <= 1) return n;
//1. dp就是第n阶的时候的方法
vector<int> dp(n+1);
// 3.dp数组进行初始化
dp[0] = 1;
dp[1] = 1;
// 4.确定遍历顺序
for(int i = 2; i <= n; i++) {
// 2.确定递推公式
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
注意点:
1.根据图片可以具体的了解dp和cost容器size的大小
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
// 1.dp的含义就是到达第i个台阶所需要的支付的费用
//最后要到达楼顶,所以要把说cost.size()+1
vector<int> dp(cost.size()+1);
// 3.dp数组初始化
dp[0] = 0;
dp[1] = 0;
// 4.确定遍历顺序
for(int i = 2; i <= cost.size(); i++) {
// 2.确定递归公式
dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
}
return dp[cost.size()];
}
};