采用动态规划。使用LIS【】保存包含当前节点的子序列的长度。
参考代码:
#include<iostream>
using namespace std;
int num[9]={ 1 ,2 ,4, 7, 4, 3, 1,8 ,1};
int find(int *array, int len,int *Pre, int *index)
{
int i,j;
int *LIS = new int[len];
int max=1;
LIS[0]=1;
Pre[0]=-1;
for(i=1;i<len;i++)
{
LIS[i]=1;
Pre[i]=-1;
for(j=0;j<i;j++)
{
if( (array[i]>array[j]) && (LIS[j]+1>LIS[i]) )
{
LIS[i]= LIS[j]+1;
Pre[i]= j;
}
}
}
for(i=0;i<len;i++)
{
if(max<LIS[i])
{
max = LIS[i];
*index=i;
}
}
return max;
}
void print(int *array, int * Pre, int index)
{
if( Pre[index] ==-1)
cout<<" "<<array[index];
else
{
print(array,Pre, Pre[index]);
cout<<" "<<array[index];
}
}
int main()
{
int index;
int Pre[9];
cout<<find(num,9,Pre,&index)<<endl;
print(num,Pre,index);
cout<<endl;
return 0;
}