算法导论15.4-5 答案

//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;
}
算法思想:先对序列排序,将结果存到另一个序列,然后求两个序列的最长公共子序列

展开阅读全文

没有更多推荐了,返回首页