最长公共子序列问题-动态规划法

最长公共子序列问题-动态规划法

最长公共子序列问题-动态规划法源代码:

#include<iostream>
using namespace std;
int L[10][10],S[10][10];

int CommonOrder(char x[],int m,char y[],int n,char z[]){
	int j,i,k;
	for(j=0;j<=n;j++)
	{
		L[0][j]=0;
	}
	for(i=0;i<=m;i++)
	{
		L[i][0]=0;
	}
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(x[i]==y[j])
			{
				L[i][j]=L[i-1][j-1]+1;
				S[i][j]=1;
			}
			else if(L[i][j-1]>=L[i-1][j])
			{
				L[i][j]=L[i][j-1];
                S[i][j]=2;
			}
			else
			{
				L[i][j]=L[i-1][j];
                S[i][j]=3;
			}
		}
	}
	i=m;j=n;k=L[m][n];
	while(i>0&&j>0)
	{
		if(S[i][j]==1){
			z[k]=x[i];k--;i--;j--;
		}
		else if(S[i][j]==2)
			j--;
		else
			i--;
	}
	cout<<"最长公共子序列是:";
	for(k=1;k<=L[m][n];k++)
		cout<<z[k];	
	cout<<endl;
	return L[m][n];
}



int main()
{
	char x[]={' ','x','z','y','z','z','y','x'};
	char y[]={' ','z','x','y','y','z','x','z'};
	char z[10];

	cout<<"长度为:"<<CommonOrder(x,7,y,7,z)<<endl;
	return 0;
}

时间复杂度:O(m*n);
最长公共子序列问题-动态规划法