最长公共子序列

 

/*
最长公共子序列
*/
#include<iostream>
#include<string>
#define max(x, y) a>b?a:b
#define For(t, i, j) for(t = i; t <= j; t++)
#define MAXM 100
#define MAXN 100

using namespace std;

int c[MAXM][MAXN], b[MAXM][MAXN];

string x, y;

void Print_LCS(int i, int j)
{
	if(i == 0 || j == 0) return;
	if(b[i][j] == 1)
	{
		Print_LCS(i-1, j-1);
		cout<<x[i-1];
	}
	else if(b[i][j] == 2) 
		Print_LCS(i-1, j);
	else 
		Print_LCS(i, j-1);
}

void LCS()
{
	int i, j, m = x.length(), n = y.length();

	For(i, 0, m) c[i][0] = 0;
	For(j, 0, n) c[0][j] = 0;

	For(i, 1, m)
		For(j, 1, n)
	{
		if(x[i-1] == y[j-1])
		{
			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;//左
		}
	}

	cout<<"最长为:"<<c[m][n]<<endl;
	Print_LCS(m, n);
	cout<<endl;
}

int main()
{

	// abcbdab bdcaba
	cin>>x>>y;
	LCS();

	system("pause");
	return 0;
}

  

posted @ 2013-11-24 11:37  偶尔会寂寞  阅读(160)  评论(0编辑  收藏  举报