题解:
动态规划五部曲:
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、确定遍历顺序:从前到后
5、举例推导dp数组(前11个斐波那契数)
0 1 1 2 3 5 8 13 21 34 55
class Solution {
public:
int fib(int n) {
//考虑到后面遍历从2开始 考虑n为0和1的情况
if(n<=1){
//前两项就是本身 直接返回即可
return n;
}
//定义dp数组 n+1个
vector<int> dp(n+1);
//由题意初始化dp数组
dp[0] = 0;
dp[1] = 1;
//遍历
for(int i = 2;i<=n;i++){
//递推公式
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
};
简化空间复杂度:
class Solution {
public:
int fib(int n) {
//考虑到后面遍历从2开始 考虑n为0和1的情况
if(n<=1){
//前两项就是本身 直接返回即可
return n;
}
//定义dp数组 n+1个
vector<int> dp(2);
//由题意初始化dp数组
dp[0] = 0;
dp[1] = 1;
//遍历
for(int i = 2;i<=n;i++){
//递推公式 使用sum来保存一项值
int sum = dp[0]+dp[1];
//更改dp[0]和dp[1]
dp[0] = dp[1];
dp[1] = sum;
}
return dp[1];
}
};