动态规划

动态规划

一、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])中取更长者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值