给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6.
输入:一组各不相同的正整数序列,每个正整数用空格隔开
输出:递增子序列,最后一个整数后面没有空格。
样例输入:
35 36 39 3 15 27 6 42
样例输出:
3 15 27 42
#include <iostream>
#include <vector>
using namespace std;
void lis(int A[],int n)
{
vector<int> sta;
int *d=new int[n];
int max_len=1;
int max_value_idx=0;
for (int i = 0; i < n; ++i)
{
d[i]=1;
for (int j = 0; j <i; ++j)
if(A[j]<=A[i]&&d[j]+1>d[i])
{
d[i]=d[j]+1;
}
if(d[i]>max_len)
{
max_len=d[i];
max_value_idx=i;
}
}
//printf("The length is:%d\n",max_len);
int m=max_value_idx;
while(d[m]>1)
{
//printf("%d->",A[m]);
sta.push_back(A[m]);
for(int n=m-1;n>=0;n--)
{
if(d[n]+1==d[m]&&A[n]<A[m])
{
m=n;
break;
}
}
}
//printf("%d\n",A[m]);
sta.push_back(A[m]);
int l=sta.size();
for(int k=l-1;k>0;k--)
printf("%d ",sta[k]);
printf("%d\n",sta[0]);
delete d;
}
int main(void)
{
int a[8]={35,36,39,3,15,27,6,42};
lis(a,8);
return 0;
}