求 最 长 不 下 降 序 列 求最长不下降序列 求最长不下降序列
题目
设有
n
(
n
<
=
1000
)
n(n<=1000)
n(n<=1000)个不相同的整数(小于
32767
32767
32767)组成的数列,记为:a1,a2,…,an,其中任意两个数不相同。
例如:
3
,
18
,
7
,
14
,
10
,
12
,
23
,
41
,
16
,
24
3,18,7,14,10,12,23,41,16,24
3,18,7,14,10,12,23,41,16,24。
若有且有 。则称为长度为
e
e
e的不下降序列。如上例中,
3
,
18
,
23
,
24
3,18,23,24
3,18,23,24为一个长度为4的不下降序列,同时也有
3
,
7
,
10
,
12
,
16
,
24
3,7,10,12,16,24
3,7,10,12,16,24长度为
6
6
6的不下降序列。程序要求,当原始数列给出后,求出最长的不下降数列的长度。
输入
第一行,一个数
n
n
n为多少个整数
第二行为
n
n
n个整数组成的序列
输出
求最长的不下降数列的长度
输入样例
10
3 18 7 14 10 12 23 41 16 24
输出样例
6
解题思路
这题我们直接用DP来做即可
设
f
[
i
]
f[i]
f[i]为前
i
i
i个数中最大不下降序列长度,那就可以得出公式为
f [ i ] = m a x ( f [ i ] , f [ j ] + 1 ) f[i] = max(f[i], f[j] + 1) f[i]=max(f[i],f[j]+1)
程序如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n, f[10001], a[10001], ans;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
f[i] = 1;
}
for(int i = 2; i <= n; ++i)
{
for(int j = 1; j < i; ++j)
if(a[i] > a[j])
f[i] = max(f[i], f[j] + 1);
ans = max(ans, f[i]);
}
printf("%d", ans);
}