//15.4-5请给出一个O(n的平方)的算法,使之能找出一个n个数的序列中最长的单调递增子序列
#include <iostream>
#include <string>
using namespace std;
int c[10][10];
int b[10][10];
#define x 10
#define y 10
int A[10]={0,2,4,5,9,8,7,6,8,9};
int partition(int A[],int p,int q)
{
int j=p,i=j-1,temp;;
int r=A[q];
for(int k=p;k<q;k++)
{
if(A[k]<=r)
{
i=i+1;
temp=A[i];
A[i]=A[k];
A[k]=temp;
}
}
temp=A[i+1];
A[i+1]=A[q];
A[q]=temp;
return i+1;
}
void quick_sort(int A[],int p,int q)
{
int r;
if(p<q)
{
r=partition(A,p,q);
quick_sort(A,p,r-1);
quick_sort(A,r+1,q);
}
}
void Lcs_Length(int A[],int B[])//求解最长公共序列
{
int i,j;
for(i=1;i<x;++i)
c[i][0]=0;
for(j=0;j<y;++j)
c[0][j]=0;
for(i=1;i<x;++i)
for(j=1;j<y;++j)
{
if(A[i]==B[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else
if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
void Print_Lcs(int b[][10],int A[],int i,int j)//递归输出最长公共序列
{
if(i==0||j==0)
return;
if(b[i][j]==1)
{
Print_Lcs(b,A,i-1,j-1);
cout<<A[i];
}
else
if(b[i][j]==2)
Print_Lcs(b,A,i-1,j);
else
Print_Lcs(b,A,i,j-1);
}
void main()
{
int B[10]={0,2,4,5,9,8,7,6,8,9};
quick_sort(A,0,9);
Lcs_Length(A,B);
Print_Lcs(b,A,9,9);
cout<<endl;
}
算法思想:先对序列排序,将结果存到另一个序列,然后求两个序列的最长公共子序列