zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    vscode安装
    Linux下 Python绘图与可视化 及matplotlib与_tkinter安装
    C语言-结构体定义的几种方式
    leetcode- 88. 合并两个有序数组
    leetcode-16. 最接近的三数之和
    Leetcode-15. 三数之和
    Leetcode-561. 数组拆分 I
    Windows_pycharm下安装numpy
    python实现两个两个的翻转字符串
    linux复制文件夹、重命名文件夹、删除文件夹
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4732624.html
Copyright © 2011-2022 走看看