【题目描述】
设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<iei1<i2<i3<…<ie 且有b(i1)<=b(i2)<=…<=b(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
就是一个长度为77的不下降序列,同时也有7 ,9,16,18,19,21,22,63
组成的长度为88的不下降序列。
【输入】
第一行为nn,第二行为用空格隔开的nn个整数。
【输出】
第一行为输出最大个数maxmax(形式见样例);
第二行为maxmax个整数形成的不下降序列,答案可能不唯一,输出一种就可以了,本题进行特殊评测。
【输入样例】
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
思路:
一维dp问题,找到转移式就好了。
我们用dp数组来记录当前数字的最大不降序长度,那么每到一个数字,只要找到它之前的数字中,不大于它的数字的最大dp值就好。
最后从后往前按照dp值去找到数字,倒序输出即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[1001];
int a[1001];
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>a[i];
}
int m=0;
for(int i=0;i<t;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(a[i]>=a[j])dp[i]=max(dp[i],dp[j]+1);
}
m=max(m,dp[i]);
}
cout<<"max="<<m<<endl;
int b[1001];
int c=0;
for(int i=t-1;i>=0;i--)
{
if(dp[i]==m){
b[c]=a[i];
c++;
m--;
}
}
for(int i=c-1;i>=0;i--)
{
cout<<b[i]<<" ";
}
cout<<endl;
return 0;
}