• Compromise(LCS)


    题目链接: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 }
  • 相关阅读:
    redis未授权访问简单总结
    CORS跨域资源共享漏洞初探
    Mysql UDF提权方法
    hacknos-player靶机渗透
    深入理解Java虚拟机-类加载连接和初始化解析
    Dnslog盲注
    让服务器使用密钥
    自动备份站点
    自动放行nginx后台访问ip
    mysql增备
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4732624.html
Copyright © 2020-2023  润新知