Description
求一个整数序列的最长递增子序列。
Input
输入的第一行是一个正整数n,表示测试例个数。接下来几行是n个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数k (k<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。(设给出的每个整数序列的最长递增子序列都是唯一的。)
Output
对于每个测试例输出两行,第一行为最长递增子序列的长度,第二行为最长递增子序列,整数之间用一个空格隔开。两个测试例的输出数据之间用一个空行隔开。
Sample Input
2 5 3 1 4 2 3 6 1 3 9 5 2 6
Sample Output
3 1 2 3 4 1 3 5 6
KEY:动态规划吧……求完后,还有反向打印的一说;
Source:
#include < iostream.h >
int max;
int a[ 501 ];
int b[ 501 ];
int m[ 501 ];
int n;
void longest()
... {
int i,j,k;
int p=0;
for(i=1,b[0]=1;i<n;i++)
...{
for(j=0,k=0;j<i;j++)
if(a[j]<a[i]&&k<b[j])
k=b[j];
b[i]=k+1;
}
max=0;
int pos;
for(i=0;i<n;i++)
if(b[i]>max)
...{
max=b[i];
pos=i;
}
cout<<max<<endl;
for(i=pos-1,m[++p]=a[pos];i>=0;i--)
...{
if(b[pos]==b[i]+1&&a[i]<a[pos])
...{
m[++p]=a[i];
pos=i;
}
}
for(i=p;i>1;i--)
cout<<m[i]<<" ";
cout<<m[i]<<endl<<endl;
}
int main()
... {
// freopen("fjnu_1700.in","r",stdin);
int N;
cin>>N;
int i,j;
for(i=1;i<=N;i++)
...{
cin>>n;
for(j=0;j<n;j++)
cin>>a[j];
longest();
}
}