动规五部曲
1. 确定 dp 数组 和 下标的含义
2. 递推公式
3. dp 初始化
4. 遍历顺序
从前向后 / 从后向前 / 双重循环的先后
5. 打印dp数组 用来debug的
在本题
1. dp数组的含义就是 需要求的值 , 下标的含义就是对应第 n 个数字
2. 递推公式 dp[ i ] = dp[ i - 1] + dp[ i - 2]
3. 初始化题目已经说明了
4.遍历顺序 从前向后
class Solution {
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++)
dp[i] = dp[i - 1] + dp[ i - 2];
return dp[n];
}
};
也可以只有两个元素的数组来维护
class Solution {
public:
int fib(int n) {
if(n <= 1 ) return n;
int dp[2];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n ;i++)
{
int sum = dp[0] + dp[1];
dp[0] = dp[1];
dp[1] = sum;
}
return dp[1];
}
};