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;

}

你可能感兴趣的:(Promise)