题目链接: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("\n");
35                 i++, j++;
36             }
37             else if (d[i+1][j]==d[i][j]) i++;
38             else j++;
39         }
40     }
41     return 0;
42 }

 

posted on 2015-08-15 16:06  尘埃。  阅读(224)  评论(1编辑  收藏  举报