题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/D
题意:
给出两段文字,以#为结束符,输出最长的公共单词串。
案例:
input
die einkommen der landwirte
sind fuer die abgeordneten ein buch mit sieben siegeln
um dem abzuhelfen
muessen dringend alle subventionsgesetze verbessert werden
#
die steuern auf vermoegen und einkommen
sollten nach meinung der abgeordneten
nachdruecklich erhoben werden
dazu muessen die kontrollbefugnisse der finanzbehoerden
dringend verbessert werden
#
output
die einkommen der abgeordneten muessen dringend verbessert werden
思路分析:
倒序储存状态。注意一定要清零。
状态转移方程:1)如果单词不相等 d[i][j]=d[i+1][j+1];
2)如果相等 d[i][j]=max(d[i+1][j],d[i][j+1],d[i+1][j+1]+1)
输出所有d[i][j]==d[i+1][j+1]+1情况下的a[i]即可,注意空格输出。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int main() 6 { 7 char a[105][35], b[105][35]; 8 int d[105][105]; 9 int i,j,x,y; 10 while(scanf("%s",a[0])!=EOF) 11 { 12 x=0;y=0; 13 while(strcmp(a[x],"#")) 14 scanf("%s",a[++x]); 15 scanf("%s",b[y]); 16 while(strcmp(b[y],"#")) 17 scanf("%s",b[++y]); 18 memset(d,0,sizeof(d)); 19 for(i=x-1;i>=0;i--) 20 for(j=y-1;j>=0;j--) 21 { 22 if (strcmp(a[i],b[j])) d[i][j]=d[i+1][j+1]; 23 else d[i][j] = d[i+1][j+1] + 1; 24 if (d[i][j]<d[i+1][j]) d[i][j]=d[i+1][j]; 25 if (d[i][j]<d[i][j+1]) d[i][j]=d[i][j+1]; 26 } 27 i=j=0; 28 while (i<x&&j<y) 29 { 30 if (d[i][j]==d[i+1][j+1]+1) 31 { 32 printf("%s",a[i]); 33 if (d[i+1][j+1]) printf(" "); 34 else printf(" "); 35 i++, j++; 36 } 37 else if (d[i+1][j]==d[i][j]) i++; 38 else j++; 39 } 40 } 41 return 0; 42 }