动态规划
一、fib()递归
fib(n)=fib(n-1)+fib(n-2)
复杂度:T(0)=T(1)=1
T(n)=T(n-1)+T(n-2)+1//1是那个加法
令S(n)=(T(n)+1)/2
S(0)=1=fib(1) S(1)=1=fib(2)
S(n)=S(n-1)+S(n-2)=fib(n+1)
T(n)=2*S(n)-1=2*fib(n+1)-1=O(fib(n+1))=O(Φ^n)=O(2^n)//Φ=(1+√5)/2
二、fib()迭代
解决方法A(记忆法:memoization)
将已计算过实例的结果制表查备
解决方法B(动态规划 dynamic programming)
颠倒计算方向,由自顶而下递归,为自底而上迭代
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int f=0;
int g=1;
while (0<n--)
{
g=g+f;
f=g-f;
}
cout<<g<<endl;
return 0;
}
这里时间复杂度是O(n),空间复杂度是O(1)
三、最长公共子序列(LCS)
1.LCS递归
对于序列A[0,n]和B[0,m],LCS(A,B)无非三中情况
0)若n=-1或m=-1,则取作空序列(“”)
1)若A[n]=‘X’=B[m],则取作LCS(A[0,n),B[0,m))+'X'//减而治之
2)A[n]<>B[m],则在 LCS(A[0,n],B[0,m))与LCS(A[0,n),B[0,m])中取更长者