POJ2250 - Compromise(LCS+打印路径)

题目大意

给定两段文本,问公共单词有多少个

题解

裸LCS。。。

代码:

#include<iostream>
#include<string>
using namespace std;
#define MAXN 105
string x[MAXN],y[MAXN];
int path[MAXN][MAXN],dp[MAXN][MAXN];
int n,m;
void work()
{
    for(int i=1; i<=n; i++)
        dp[i][0]=0;
    for(int j=0; j<=m; j++)
        dp[0][j]=0;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(x[i]==y[j])
            {
                dp[i+1][j+1]=dp[i][j]+1;
                path[i+1][j+1]=0;
            }
            else
            {
                if(dp[i][j+1]<dp[i+1][j])
                {
                    dp[i+1][j+1]=dp[i+1][j];
                    path[i+1][j+1]=1;
                }
                else
                {
                    dp[i+1][j+1]=dp[i][j+1];
                    path[i+1][j+1]=-1;
                }
            }
}
void print(int i,int j)
{
    if(i==0||j==0)
        return;
    if(path[i][j]==0)
    {
        print(i-1,j-1);
        cout<<x[i-1]<<" ";
    }
    else if(path[i][j]==1)
        print(i,j-1);
    else
        print(i-1,j);
}
int main()
{
    string s;
    while(cin>>s)
    {
        n=0,m=0;
        x[n++]=s;
        while(cin>>s&&s[0]!='#')
            x[n++]=s;
        while(cin>>s&&s[0]!='#')
            y[m++]=s;
        work();
        print(n,m);
        cout<<endl;
    }
    return 0;
}

posted on 2013-08-13 21:25  仗剑奔走天涯  阅读(209)  评论(0编辑  收藏  举报

导航