//写在前面:
//给定一数字序列,找到其最长的上升子序列
//状态转移方程为: if(arrary[j]>arrary[i])dp[j]=max(dp[j],dp[i]+1);
//其中arrary[i]为数字序列中下标为i的值
#include <iostream>
#include <string.h>
#define maxn 1005
using namespace std;
int ipnum[maxn];
int dp[maxn];
int path[maxn];//保存路径
void print_path(int k)//递归打印路径
{
if(path[k]==k)
{
cout<<ipnum[k]<<' ';
return;
}
else print_path(path[k]);
cout<<ipnum[k]<<' ';
return;
}
int main()
{
int N;cin>>N;int maxlen=1,biao=0;//分别记录最长上升子序列的长度,和下标
for(int i=0;i<N;i++){cin>>ipnum[i];dp[i]=1;path[i]=i;}
for(int i=0;i<N;i++)
{
for(int j=0;j<i;j++)
if(ipnum[j]<ipnum[i]&&dp[i]<(dp[j]+1))//DP核心代码
{
dp[i]=dp[j]+1;
if(dp[i]>maxlen)maxlen=dp[i];
path[i]=j;
biao=i;
}
}
cout<<"maxlen: "<<maxlen<<'\n';
print_path(biao);
}
/*
12
35 36 39 3 15 27 6 42 78 37 72 1
*/