最长不下降子序列//序列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做法
原文地址:https://www.cnblogs.com/gc812/p/5792181.html