给定一个序列,求这个序列的最长上升子序列的长度,并输出这个最长上升子序列,题目保证,最长上升子序列只有一个。
第一行输出一个数,代表最长上升子序列的长度。
第二行打印这个子序列。
输入
8 5 2 8 6 3 6 5 7
输出
4 2 3 6 7
#include<stdio.h>
#include<stdlib.h>
const int N=100;
int dp[N],s[N],arr[N],tt[N];
int main(){
int n;
scanf("%d",&n);
int i,j,k;
int max=1;
for(i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
for(i=1;i<=n;i++){
dp[i]=1;
s[i]=i;
for(j=1;j<i;j++){
if(arr[i]>arr[j]&&dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
s[i]=j;
}
}
if(dp[i]>=max) {
max=dp[i];
k=i;
}
}
int m=0;
while(true){
tt[m++]=arr[k];
if(s[k]==k){
break;
}
k=s[k];
}
for(i=m-1;i>0;i--){
printf("%d ",tt[i]);
}
printf("%d",tt[0]);
}