1.用递归算法求兔子数列
1.1 优点:程序代码简洁明了
1.2 缺点:当数据规模较大时运算时间很长,原因是有重复运算
1.3 优化:用动态规划算法进行优化(记忆化搜索)
1.4 代码
#include <bits/stdc++.h>
using namespace std;
int f (int n)
{
return n<=2?1:f(n-1)+f(n-2); //三目运算
}
int main()
{
cout<<f(20);
return 0;
}
2.记忆化搜索求兔子数列
代码
注:记忆化搜索就是用额外的空间来换取时间。
#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];
}
3.动态规划求兔子数列
3.1 动态规划是一步一总结,步步为营,稳扎稳打。
3.2 动态规划的关键是递推公式,也称之为状态转移方程,非常难推出
3.3 动态规划的代码很短,但 是非常抽象,非常难理解。
3.4 常用名词:阶段,阶段变量,状态,状态变量
3.5 代码
#include <bits/stdc++.h>
using namespace std;
long long f[1000];
int main()
{
int n=100;
f[1]=f[2]=1;
for(int i=3;i<=n;i++)
{
f[i]=f[i-1]+f[i-2];
}
cout<<f[n];
return 0;
}
4.动态规划的主要问题类型:、
4.1 背包问题:01背包(每种物品只有一个),完全背包(每种物品有无数个),多重背包(每种物品有若干个个),二维背包(限制因素有两个,比如体积和重量)。(注:背包问题的三要素:耗费,收益和限制)
4.2 最长不降子序列
4.3 最长公共子序列
4.4 区间动态规划