POJ2250

来源:互联网 发布:知乎 钢铁雄心3 编辑:程序博客网 时间:2024/04/28 07:37

最长公共子序列,用map对输入的字符串进行处理之后就只是一个LCS了.最后通过递归求出路径就搞定了.

#include <iostream>#include <map>#include <cstdio>#include <cstring>#include <cmath>#define MAXN 105using namespace std;int a[MAXN],b[MAXN];int tem[MAXN];int dp[MAXN][MAXN];int path[MAXN];int va[MAXN],vb[MAXN];int main(){    string s;    int i,j;    while(cin>>s)    {        if(s=="#")        {            cout<<"0"<<endl;            continue;        }        int si=1,as=1,bs=1;        map<string ,int> M;        M[s]=si++;        a[as++]=M[s];        while(cin>>s)        {            if(s=="#") break;            if(M[s]==0)            {                M[s]=si++;            }            a[as++]=M[s];        }        while(cin>>s)        {            if(s=="#") break;            if(M[s]==0)            {                M[s]=si++;            }            b[bs++]=M[s];        }        int pa=0;        memset(dp,0,sizeof(dp));        memset(path,0,sizeof(path));        for(i=1;i<as;i++)        {            for(j=1;j<bs;j++)            {                if(a[i]==b[j])                {                    dp[i][j]=dp[i-1][j-1]+1;                }                else                {                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);                }            }        }        i=as-1;j=bs-1;        while(i>0&&j>0)//循环得到路径        {            if(dp[i][j]==dp[i-1][j])                i--;            else if(dp[i][j]==dp[i][j-1])                j--;            else            {                path[pa++]=a[i];                i--;j--;            }        }        int flag=0;        map<string,int>::iterator iter;        for(i=pa-1;i>=0;i--)        {            for(iter=M.begin();iter!=M.end();iter++)            {                if(iter->second==path[i])                {                    if(flag) cout<<" ";                    flag=1;                    cout<<iter->first;                }            }        }        cout<<endl;    }    return 0;}


0 0
原创粉丝点击