zoukankan      html  css  js  c++  java
  • 动态规划练习题 胖男孩

    题目描述

        麦克正如我们所知的已快乐地结婚,在上个月他胖了70磅。因为手指上的脂肪过多,使他连给他最亲密的朋友斯拉夫克写一个电子邮件都很困难。

        每晚麦克都详细地描述那一天他所吃的所有东西,但有时当他只想按一次某键时往往会按了不止一次,并且他的胖手指还会碰到他不想要按的键,麦克也知道自己的手指有问题,因此他在打字的时候很小心,以确保每打一个想要的字符时误打的字符不超过3个,误打的字符可能在正确字符之前也可能在其之后。

    当斯拉夫克多次收到读不懂的电子邮件后,他总是要求麦克将电子邮件发3遍,使他容易读懂一点。

    编写程序,帮助斯拉夫克根据他所收到的三封电子邮件求出麦克可能写出的最长的信。

    输入

    输入文件包含了三行文本。每一行文本包括麦克信件的一种版本。其中所有的字符都由英文字母表中的小写字母组成并且不超过100个。

    输出

    输出文件中第一行即唯一的一行数据应该包含斯拉夫克根据所收到的电子邮件推测出的最长信件。你可以相信问题一定有解,但解不一定是唯一的。

    样例

    FATBOY.IN

    cecqbhvaiaedpibaluk
    
    cabegviapcihlaaugck
    
    adceevfdadaepcialaukd 

    FATBOY.OUT

    cevapiluk

    题解

    最长公共子序列lcs的变体

    对于每两个正确字符间最多可能塞了6个错误字符,所以比较并非全文比较

    #include<string>
    #include<iostream>
    using namespace std;
    const int N=101;
    int ls,lt,ld;
    string f[N][N][N],s,t,d,ans;
    int main(){
        ios::sync_with_stdio(false);
        cin>>s>>t>>d;
        ls=(int)s.size();
        lt=(int)t.size();
        ld=(int)d.size();
        s='0'+s;
        t='0'+t;
        d='0'+d;
        for(int i=1;i<=ls;i++)
        for(int j=1;j<=lt;j++)
        for(int k=1;k<=ld;k++)
            if(s[i]==t[j]&&t[j]==d[k]){
                f[i][j][k]=s[i];
                for(int x=max(0,i-7);x<i;x++)
                for(int y=max(0,j-7);y<j;y++)
                for(int z=max(0,k-7);z<k;z++)
                    if(f[i][j][k].size()<=f[x][y][z].size()+1)
                    f[i][j][k]=f[x][y][z]+s[i];
                if(ans.size()<=f[i][j][k].size())
                ans=f[i][j][k];
            }
        cout<<ans<<endl;
        return 0;
    } 
  • 相关阅读:
    之前的博客
    用struts2 s2-045漏洞拿站记录
    修改BlackLowKey皮肤样式,增加占屏比
    SpringBoot自动配置原理
    CAS无锁技术
    CAS单点登录原理解析
    死锁与活锁的区别,死锁与饥饿的区别
    jvm问题
    jdk动态代理的实现原理
    抽象工厂
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6071908.html
Copyright © 2011-2022 走看看