Description
求最长上升子序列。
Input
单测试用例。
第一行是一个正整数n,0 < n ≤ 3000
第二行是n个非负整数。
Output
两行结果。
第一行是最长上升子序列的长度。
第二行是任意一个最长上升子序列,每个整数后面跟一个空格。
Sample Input
8
5 2 8 6 3 6 9 7
Sample Output
4
2 3 6 7
#include<cstdio>
int a[3001],b[3001],c[3001];
int main()
{
int n,m,k,i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=1;
}
t=0;m=1;k=0;
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[j]<a[i]&&b[j]>=t)
{
t=b[j];c[i]=j;
}
}
c[i]=j;
b[i]=t+1;
if(b[i]>=m)
{
m=b[i];k=i;
}
t=0;
}
t=0;
printf("%d\n",m);
for(i=0;i<m;i++)
{
b[i]=a[k];
k=c[k];
}
for(i=m-1;i>=0;i--)
{
printf("%d",b[i]);
if(i>0) printf(" ");
}
printf("\n");
return 0;
}