BZOJ1830: [AHOI2008]Y型项链 & BZOJ1789: [Ahoi2008]Necklace Y型项链

【传送门:BZOJ1830&BZOJ1789


简要题意:

  给你3个字符串,你每一次可以在一个字符串的末端删除一个字符或添加一个字符,你需要用尽量少的操作次数使得这3个字符串变成一样的。 


题解:

  模拟直接搞,模拟以每个串的每个位置为最终答案,求最小值即可


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
char s1[51],s2[51],s3[51];
int main()
{
    int len1,len2,len3;
    scanf("%d%s",&len1,s1+1);
    scanf("%d%s",&len2,s2+1);
    scanf("%d%s",&len3,s3+1);
    int mmin=1<<31-1,ans;
    int b1=0,b2=0,b3=0;
    for(int i=1;i<=len1;i++)
    {
        ans=len1-i;
        if(b2!=0) ans+=len2-b2+1+i-b2+1;
        else if(s1[i]!=s2[i]) b2=i,ans+=len2-b2+1+i-b2+1;
        else ans+=len2-i;
        if(b3!=0) ans+=len3-b3+1+i-b3+1;
        else if(s1[i]!=s3[i]) b3=i,ans+=len3-b3+1+i-b3+1;
        else ans+=len3-i;
        mmin=min(ans,mmin);
    }
    b1=0;b2=0;b3=0;
    for(int i=1;i<=len2;i++)
    {
        ans=len2-i;
        if(b1!=0) ans+=len1-b1+1+i-b1+1;
        else if(s2[i]!=s1[i]) b1=i,ans+=len1-b1+1+i-b1+1;
        else ans+=len1-i;
        if(b3!=0) ans+=len3-b3+1+i-b3+1;
        else if(s2[i]!=s3[i]) b3=i,ans+=len3-b3+1+i-b3+1;
        else ans+=len3-i;
        mmin=min(ans,mmin);
    }
    b1=0;b2=0;b3=0;
    for(int i=1;i<=len3;i++)
    {
        ans=len3-i;
        if(b1!=0) ans+=len1-b1+1+i-b1+1;
        else if(s3[i]!=s1[i]) b1=i,ans+=len1-b1+1+i-b1+1;
        else ans+=len1-i;
        if(b2!=0) ans+=len2-b2+1+i-b2+1;
        else if(s3[i]!=s2[i]) b2=i,ans+=len2-b2+1+i-b2+1;
        else ans+=len2-i;
        mmin=min(ans,mmin);
    }
    printf("%d\n",min(mmin,len1+len2+len3));
    return 0;
}

 

posted @ 2018-04-25 07:54  Star_Feel  阅读(143)  评论(0编辑  收藏  举报