标签:cep ges pad ons seq like into instance file
apple peach ananas banana pear peach
appleach bananas pearch
/* 这道题是这样输出的。首先读取s1的字符,读取时推断是否是公共字符。假设是就把s1前面的字符所有输出, 然后就来推断s2。(和推断s1是一样的),然后把公共字符输出,一直这样推断,直到最后一个公共字符 当最后一个公共字符推断完了后,把剩下的输出,先输s1,再s2. */ #include<stdio.h> #include<string.h> #define max(a,b) (a)>(b)?(a):(b) char s1[200],s2[200]; int dp[200][200]; struct subsequence { int i,j; char ch; }common[120]; int main() { int i,j,k; int len1,len2; while(~scanf("%s%s",s1,s2)) { len1=strlen(s1); len2=strlen(s2); memset(dp,0,sizeof(dp)); for(i=1;i<=len1;++i) //LCS { for(j=1;j<=len2;++j) { if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } if(dp[len1][len2]==0)//假设没有公共的,直接输出 { printf("%s%s\n",s1,s2); continue; } else//有就開始记录 。倒着记录 { i=len1;j=len2; k=0; while(i>=1&&j>=1) { if(dp[i][j]==dp[i-1][j-1]+1&&s1[i-1]==s2[j-1])//最后一位同样,就存起来 { common[k].i=i-1;//记录s1串的公共子序列(最后一个。倒数第二个.....) 元素的位置 common[k].j=j-1;//记录s2串的公共子序列(最后一个,倒数第二个.....) 元素的位置 common[k].ch=s1[i-1];//记录该公共字符 i--,j--; k++; } else if(dp[i-1][j]>dp[i][j-1])//当去掉s1的最后一个元素的s1比去掉s2最后一个元素的最大公共子序列还要大的时候,说明s1的末尾不是最长子序列的一部分 i--; else j--; } } i=j=0; for(k=k-1;k>=0;--k) { while(common[k].i!=i)//先输出s1 { printf("%c",s1[i]); ++i; } while(common[k].j!=j)//再输s2 { printf("%c",s2[j]); ++j; } printf("%c",common[k].ch); ++i,++j; } while(s1[i]!='\0')//输出剩下的 { printf("%c",s1[i]); ++i; } while(s2[j]!='\0') { printf("%c",s2[j]); ++j; } puts(""); } return 0; }
Advanced Fruits HDU杭电1503【LCS的保存】
标签:cep ges pad ons seq like into instance file
原文地址:http://www.cnblogs.com/mfmdaoyou/p/6885529.html