poj1934-打印LCS全部路径+搜索

来源:互联网 发布:矩阵论 清华 编辑:程序博客网 时间:2024/04/29 06:51

题目连接

题意:

打印全部LCS路径,并按照字典顺序输出。

本题比较难。

参考神人代码

稍做改进如下:

#include <stdio.h>#include <string.h>#include <math.h>#include <string>#include <set>using namespace std;const int N=100;set<string> SET;char s1[N],s2[N],temp[N];int len1,len2,longest;int last1[N][27],last2[N][27],dp[N][N];int max(int a,int b){   return a>b?a:b;}void DFS(int x,int y,int len){    if(len<=0)    {        SET.insert(&temp[1]);        return ;    }    if(x>0 && y>0)        for(int i=0;i<26;i++)        {            int t1=last1[x][i];            int t2=last2[y][i];            if(dp[t1][t2]==len)            {                temp[len]='a'+i;                DFS(t1-1,t2-1,len-1);            }        }}void solve(){      int i,j;       for(i=1;i<=len1;i++)        for(j=1;j<=len2;j++)        {            if(s1[i]==s2[j])                dp[i][j]=dp[i-1][j-1]+1;            else    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);        }        longest=dp[len1][len2];         for(i=1;i<=len1;i++)            for(j=0;j<26;j++)            {                if(s1[i]=='a'+j)                    last1[i][j]=i;                else     last1[i][j]=last1[i-1][j];            }        for(i=1;i<=len2;i++)            for(j=0;j<26;j++)            {                if(s2[i]=='a'+j)                    last2[i][j]=i;                else last2[i][j]=last2[i-1][j];            }          temp[longest+1]='\0';          DFS(len1,len2,longest);          set<string>::iterator it;         for(it=SET.begin();it!=SET.end();it++)          {            printf("%s\n",(*it).c_str());          }}int main(){   scanf("%s %s",&s1[1],&s2[1]);    len1=strlen(&s1[1]);    len2=strlen(&s2[1]);    solve();    return 0;}





原创粉丝点击