当前位置:首页 > 动态规划 > 序列DP > 正文
SSOJ2414最长不下降序列
2898+

题目大意:给定一个n个数的数列,求最长不下降的子序列,需要输出它的长度以及编号字典需最小的序列。

题目描述

设有由n(1<=n<=200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)<>b(j)(i<>j),若存在i1<i2<i3< … < ie 且有b(i1)<b(i2)< … <b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的不下降序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为8的不下降序列。

输入

第一行为n,第二行为用空格隔开的n个整数。

输出

第一行为输出最大个数max(形式见样例);

第二行为max个整数形成的不下降序列,答案可能不唯一,输出一种就可以了,本题进行特殊评测。

样例输入

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

样例输出

max=8
7 9 16 18 19 21 22 63

提示

不特判,输出编号字典需最大的序列

解题思路

f[i]表示以第i个数结尾的最长不下降子序列的长度,他的前一个可能是1到i-1中的不比他小的数,如果发现1到i-1的标号中编号j的数比他小而且f[j]+1超过f[i],那么a[j]接在a[j]后面,以a[i]结尾的数列就更长,长度是f[j]+1,这个数的前一个是就是a[j]。最大长度只需要枚举一下以各个数结尾的最长不下降子序列长度即可;输出序列可以递归输出路径。

程序实现

SSOJ2414最长不下降序列:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!