下面程序是用动态规划法写的
void LIS(int *a,int n)
{
int *Lis=new int[n]; //存储以i为结尾的最长子序列,动态规划法
int *prev=new int[n]; //prev[]存储最长子序列的每一个值的“前驱”的下标值,
//例如测试中的最长子序列1,4,8,10(下标分别为0,2,4,6),则prev[0]=-1,prev[2]=0,prev[4]=2,prev[6]=4
memset(prev,-1,n*sizeof(int)); //所有元素的“前驱”的下标值初始化为-1,
memset(Lis,0,n*sizeof(int));
int maxLen=0; //整个数组的最长子序列的长度
int maxIndex; //存储最长子序列的最后一个值的下标
for (int i=0;i<n;i++)
{
Lis[i]=1;
for (int j=0;j<i;j++)//这层循环求取以i结尾的最长子序列
{
if (a[i]>a[j] && Lis[j]+1>Lis[i])
{ //动态规划
Lis[i]=Lis[j]+1;
prev[i]=j;
}
}
if (maxLen<Lis[i])//如果当前lis[i]>maxLen,则更新maxLen
{
maxLen=Lis[i];
maxIndex=i; //最长子序列的最有一个元素下标更新为i,相当于子序列增长了
}
}
cout<<maxLen<<endl;
i=maxIndex;
while(i!=-1)
{
cout<<a[i]<<" ";
i=prev[i];
}
cout<<endl;
delete [] Lis;
}
void main()
{
int a[8]={1,-1,4,-5,8,-7,10,-9};
LIS(a,8);
}
测试如下