【tyvj】P1049 最长不下降子序列


时间: 1000ms / 空间: 131072KiB / Java类名: Main


描述

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


输入格式

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


输出格式

最长不下降子序列的长度


测试样例1

输入

3

1 2 3

输出

3


备注

N小于5000

for each num <=maxint


我们弄一个数组f[i]表示前i个数的最长长度,一开始全都置为1是他自己本身。然后先对0~n-1循环。i =0 ~ n-1对于每一个a[i]在他后面的数设为a[j] (j>i)

如果a[j]>a[i]那说明是有可能被算成最长子序列的。

此时对于a[i]而言无非两种情况,一种是跟着j混,一种是不跟。所以f[j]=max(f[i]+1,f[j])

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n,max=0;
10     cin>>n;
11     int f[5000],a[5000];
12     for (int i=0; i<n; ++i)
13         cin>>a[i];
14 
15     for (int i=0;i<n;++i)
16         f[i]=1;
17     for (int i=0; i<n-1; ++i) {
18         for (int j=i+1;j<n;++j)
19             if (a[j]>=a[i]&&f[i]+1>f[j])
20                 f[j]=f[i]+1;
21     }
22     for (int i=0; i<n; ++i)
23         if (max<f[i])
24             max=f[i];
25 
26     cout<<max<<endl;
27     return 0;
28 }
原文地址:https://www.cnblogs.com/gc812/p/5764565.html