用递归的方法求兔子数列
1.1 优点是程序代码简洁明了
1.2 缺点是当规模比较大时,运行时间很长很长,原因是有重复计算
![](https://i-blog.csdnimg.cn/blog_migrate/64c453bac213546371e00cbdea52bdae.png)
1.3 优化 用动态规划算法进行优化(记忆化搜索)
程序
#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
if(n<=2)
{
return 1;
}
else
{
return f(n-1)+f(n-2);
}
}
int main()
{
cout<<f(60);
return 0;
}
用记忆化搜索求兔子数列
![](https://i-blog.csdnimg.cn/blog_migrate/a3b2fdd7c8b0b60a420daf0661580265.png)
注:额外用空间换时间
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int f(int n);
int main()
{
cout<<f(60);
return 0;
}
int f(int n)
{
if(a[n]==0) //没有计算过才计算
{
if(n<=2)
{
a[n]=1;
}
else
{
a[n]=f(n-1)+f(n-2);
}
}
return a[n];
}
动态规划求兔子数列
![](https://i-blog.csdnimg.cn/blog_migrate/13c2519363e7537e088beda862b0b659.png)
3.1 动态规划就是一步一总结,步步为营,稳扎稳打
3.2 动态规划关键是递推公式(非常难推出)
3.3 动态规划的代码很短,但是非常难理解,很抽象
3.4 常用名词,阶段变量,状态,状态变量
#include<bits/stdc++.h>
using namespace std;
long long f[1000];
int n=60;
int main()
{
f[1]=f[2]=1;
for(int i=3;i<=n;i++)
{
f[i]=f[i-1]+f[i-2];
}
cout<<f[60];
return 0;
}
动态规划的主要问题类型:
4.1 背包问题:0-1背包(每种物品有一个),完全背包(每种物品有无数个),多重背包(每种物品有若干个),二维背包(限制因素有两个,比如体积和重量)
注:背包问题三要素:耗费,收益,限制
4.2 最长不降子序列问题
4.3 最长公共子序列问题
4.4 区间动态规划问题