动态规划:能将问题分解成小的子问题,并且大的子问题是与小的子问题有关的
关键是找到二者之间的关系,也就是状态转移方程和边界条件、状态初值
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
class Solution {
public:
int fib(int n) {
/* 1.递归
if(n<=1)
return n;
else
return fib(n-1)+fib(n-2);*/
/* 2 动态规划
if(n<=1)
return n;
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];
*/
/*3 动态规划优化,压缩存储空间,很容易知道fib(n)只与fib(n-1) fib(n-2)直接相关,因此,只需不断更新他俩即可 */
if(n<=1)
return n;
int f0=0,f1=1;
int s;
for(int i=2;i<=n;i++){//第n个数是第n-1与n-2相加得到的,每次运算完之后f0与f1也相应的后移
s = f0 +f1;
f0 =f1;
f1 =s;
}
return s;
}
};