bzoj1830 Y形项链
2016-02-15 13:43
375 查看
Description
小可可得到了一个可爱的Y型项链。小可可现在的项链是这个样子的:项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子。小可可希望让这3个链子完全一样,她每次可以从一端取下来一个宝石,或者从一端安上去一个宝石。假设小可可每种宝石都有无数多个,小可可希望用尽量少的操作次数得到想要的Y型项链。小可可对于所得到的Y型项链的宝石数没有特殊的要求,所以即使你把所有宝石都弄下来了,也是一个可以接受的方案(三根光秃秃的绳子也是完全一样的)。 换句话说,给你3个字符串,你每一次可以向一个字符串的末端删除一个字符或添加一个字符,你需要用尽量少的操作次数使得这3个字符串变成一样的。Input
一共有3行,每行有一个数字N,表示Y型项链的这个链子有N个宝石,然后是一个空格,然后是N个'A'和'Z'之间的字符,表示这个链子上的宝石,每个字母表示一种不同的宝石,这个字符串最左边的字符表示的是离大珍珠最近的那个宝石,而最右边的表示的是在顶端的宝石。Output
只有一个整数:小可可所需要的最少的操作次数。枚举每个可能的最终结果(必为某串的前缀/空串),计算操作步数。
#include<cstdio> int l1,l2,l3,c; int ans; char s1[51],s2[51],s3[51],ch; void chk(){ for(int i=1;i<=l1;i++){ int m1=0,m2=0; while(s1[m1]==s2[m1]&&m1<i)m1++; while(s1[m2]==s3[m2]&&m2<i)m2++; int v=l1+i+l2-m1*2+l3-m2*2; if(ans>v)ans=v; } } int main(){ scanf("%d%s%d%s%d%s",&l1,s1,&l2,s2,&l3,s3); ans=l1+l2+l3; chk(); c=l1;l1=l2;l2=c; for(int i=0;i<51;i++){ ch=s1[i]; s1[i]=s2[i]; s2[i]=ch; } chk(); c=l1;l1=l3;l3=c; for(int i=0;i<51;i++){ ch=s1[i]; s1[i]=s3[i]; s3[i]=ch; } chk(); printf("%d",ans); return 0; }
相关文章推荐
- 第11讲项目5——坐标转换
- Android对象序列化实现
- JSP多语言第一种
- POJ 1703 并查集
- Shell变量
- android:如何在TextView实现图文混排
- 关于今年2月份Apple证书签发者无效的问题
- 深入浅出之正则表达式(一)
- mruby看起来挺不错
- SequoiaDB的 Kettle插件
- 【codevs1565】【BZOJ2242】计算器,数论练习
- Android Studio 快捷键 for Mac
- HashMap知识点串烧
- Lua string.format用法
- SpringMVC 入门基础和基本配置
- win7系统 部分软件标题乱码
- 《查看Linux系统版本以及VMWARE快照》
- Android+struts2实现文件的上传
- 第一个Shell脚本
- 关于点击状态栏回到顶部的问题