【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 }