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做法
  • 相关阅读:
    poj3417 闇の連鎖 【树上差分】By cellur925
    Luogu P1613跑路【倍增】By cellur925
    CF519E A and B and Lecture Rooms
    poj 2412 The Balance 【exgcd】By cellur925
    NOIp 2014 解方程 【数学/秦九韶算法/大数取膜】By cellur925
    Maven项目整合SSH框架
    传递依赖
    Maven项目整合Struts2框架
    K.O. -------- Eclipse中Maven的报错处理
    依赖范围
  • 原文地址:https://www.cnblogs.com/gc812/p/5792181.html
Copyright © 2011-2022 走看看