动态规划练习题 胖男孩

题目描述

    麦克正如我们所知的已快乐地结婚,在上个月他胖了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;
} 

 

posted @ 2016-11-16 22:53  keshuqi  阅读(715)  评论(0编辑  收藏  举报