poj 2250 Compromise

// 题意: 求最长公共子序列LCS,只不过是将传统的字符换成了字符串
#include<iostream>

#include<string>
using namespace std;
const int MAXN=105;
string str1[MAXN],str2[MAXN],res[MAXN];
int val[MAXN][MAXN],path[MAXN][MAXN],r1,r2,len; //r1,r2,len分别是str1,str2,res的长度
int dp(int i,int j)

{
if(i==-1||j==-1)
return 0;
if(val[i][j]!=-1)
return val[i][j];
else
{
if(str1[i]==str2[j])
{
path[i][j]=0;
val[i][j]=dp(i-1,j-1)+1;
}
else
{
int a=dp(i-1,j),b=dp(i,j-1);
path[i][j] = a > b ? 1 : 2 ; //path数组记录路径
val[i][j] = max(a,b);

}
return val[i][j];
}
}
void lcs(int i,int j)
{
if(i==-1||j==-1)
return ;
if(path[i][j]==0)
{
res[len++]=str1[i];
lcs(i-1,j-1);
}
else if(path[i][j]==1)
lcs(i-1,j);
else
lcs(i,j-1);
}
int main()
{
string s;
while(cin>>s)
{
memset(val,-1,sizeof(val));
memset(path,-1,sizeof(path));
r1=r2=len=0;
str1[r1++]=s;
while(cin>>s&&s!="#")
str1[r1++]=s;
while(cin>>s&&s!="#")
str2[r2++]=s;
dp(r1-1,r2-1);
lcs(r1-1,r2-1);
for(int i=len-1;i>=0;--i)
cout<<res[i]<<" ";
cout<<endl;
}
return 0;
}

posted on 2011-07-22 16:32  sysu_mjc  阅读(106)  评论(0编辑  收藏  举报

导航