1、题目:力扣链接
2、分析
由题目描述可知,后面的状态总与前面的状态有关。所以可以采用DP来完成,根据动态规划五部曲,具体分析如下:
1)确定dp数组的含义:
dp[i] 表示第i个斐波那契数的数值;
2) 确定dp递推公式
dp[i]=dp[i-1]+dp[i-2]
3)dp初始化
根据dp递推公式,我们可以发现应该从下标2开始进行递推,所以需要对dp[0]、dp[1]进行初始化;
dp[0]=0; dp[1]=1;
4)确定遍历顺序:
从递归公式可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的;
3、代码:
//状态压缩
class Solution {
public int fib(int n) {
if (n < 2) return n;
int a = 0, b = 1, c = 0;
for (int i = 1; i < n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
//非状态压缩
class Solution {
public int fib(int n) {
if (n <= 1) return n;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int index = 2; index <= n; index++){
dp[index] = dp[index - 1] + dp[index - 2];
}
return dp[n];
}
}