动态规划之最长子序列(线性)

来源:互联网 发布:java虚拟主机管理系统 编辑:程序博客网 时间:2024/05/17 02:00

最近做了一个有关动态规划最长子序列有关的题,就看了一些有关的资料和博客!

以下是本人的一点小心得:

最长子序列分为不上升和不下降两种!代码的实现仅仅是一个大于号小于号的区别!

就拿最长不下降子序列来说,在这个序列中,例如:a[1,n];a1<=a2<=.......<=an-1<=an;

具体的实现:

用两个数组:a[],d[];     a[]用来储存序列中的数,d[]用来记录最长子序列的长度!

我们要做的就是,使a[x]尽可能的小,这样序列中后面的数值可以加进来的就尽可能的多!

动态方程:d[i]={d[j]+1&&a[i]>a[j]}

具体代码如下:

#include <stdio.h>#include <algorithm>using namespace std;int a[10001],d[10001];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int i,j;        for(i=1;i<=n;++i)            scanf("%d",&a[i]);        for(i=1;i<=n;++i)        {            d[i]=1;            for(j=1;j<i;++j)            {                if(a[j]<=a[i]&&d[j]+1>d[i])                   d[i]=d[j]+1;            }        }        sort(d+1,d+1+n);        printf("%d\n",d[n]);    }    return 0;}


此代码的算法复杂度为:O(n*n);

在搜索序列中数据的时候,可以利用二分查找法,而不是一次次的遍历!

更优的代码算法复杂度为:O(n*logn);

原创粉丝点击