zoukankan      html  css  js  c++  java
  • 最长不下降子序列//序列dp

    最长不下降子序列
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    求最长不下降子序列的长度

    输入格式

    第一行为n,表示n个数
    第二行n个数

    输出格式

    最长不下降子序列的长度

    测试样例1

    输入


    1 2 3

    输出

    3

    备注

    N小于5000
    for each num <=maxint
     
     

     
    由N小于5000可知可以使用蛋疼的平方算法。
    那么首先,我们都知道对于一个数列来讲,不下降子序列最短的的长度肯定是1。

    那么我们设置一个f[i],表示以第i个数为结尾的最长不下降子序列是多少

    (a[i],a[j]表示第i个或者第j个元素)那么对于每一个比i小的j,如果存在a[i]>=a[j]那么我们就f[i] = max(f[i],f[j]+1)
    //循环先i后j,国际惯例, i = 1->n j 就是 1-> i-1
    //答案要从1->n里面找,不能就输出最后一个
    //别忘了调用dp
    //j<=i-1已经保证j<i了,不要再判断一次了
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,a[5005];
    int f[5005];
    int dp()//buxiajiang
    {
    //    if(x==y)return f[x];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i-1;j++)
            {
                if(a[i]>=a[j])
                {
                    f[i]=max(f[i],f[j]+1);
                }
            }
        }
    }
    int main()
    {
        cin>>n;
    //    memset(f,0,sizeof(f));
        for(int i=0;i<=n;i++)f[i]=1;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        dp();
        sort(f+1,f+1+n);
        cout<<f[n];
        puts("");
        return 0;
    }
    蠢哭的代码酱n^2做法
  • 相关阅读:
    如何在SQLite中创建自增字段?
    Windows XP平台下编译boost[1.47及以上]
    智能指针的向下转型
    采用Boost::filesystem操作文件
    CodeSmith访问数据库
    std::string的一些操作
    PDF加入内嵌字体
    悟空和唐僧的对话
    收获和教训的一天配置ds1401
    vxworks的一个changlog
  • 原文地址:https://www.cnblogs.com/gc812/p/5792181.html
Copyright © 2011-2022 走看看