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; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚