详解在代码段
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1001],b[1001],c[1001],l=1;
/*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 //i
a[i] 13 7 9 16 38 24 37 18 44 19 21 22 63 15 //测试用例
b[i] 1 1 2 3 4 4 5 4 6 5 6 7 8 2 //从上一个断档开始,是第几大的数
c[i] 0 0 2 3 4 4 6 4 7 8 10 11 12 3 //与前数的差
*/
while(cin>>a[l])//未知i的个数,所以...
{
b[l]=1,c[l]=0;
l++;
if(cin.get()=='\n')
break;
}
int maxn,k;
for(int i=1;i<=l+1;i++)//遍历从上一个断档开始,是第几大的数
{
maxn=0,k=0;
for(int j=1;j<i;j++)
{
if(a[j]<a[i]&&b[j]>maxn)
{
maxn=b[j];
k=j;
}
}
b[i]=maxn+1;
c[i]=k;
}
k=1;
for(int i=1;i<=l+1;i++)//求出最大的b[i]
{
if(b[i]>b[k])
k=i;
}
cout<<"max="<<b[k]<<endl;
int num[1001],js=0;
while(k!=0)
{
num[js]=a[k];
k=c[k];
js++;
}
for(int i=js-1;i>=0;i--)//因为我是倒着写入的,so倒着输出
{
cout<<num[i]<<" ";
}
}