紫书——Kickdown UVA - 1588

题解:

第三章计算难题之一。

首先要理清题目,这次给出的两个字符串是不可翻转,怎样转都不行,反正就是往简单方面想就是了。

然后看出字符串长度不长,完全可以枚举所有情况。起始思路为两条串,分别从左边尝试到右边,如:

121和12211

开始:121

               12211

结尾:          121

            12211

这样最后求出的最短长度就是所求答案。


但是这样超级难写!!!lz想这样写想了很久还是没办法

这时候换个思路

当枚举到    

121

12211

的时候为一个点


其次如果之后枚举下去

 121

12211

然后交换一下上下顺序就变成了

12211

  121

可以说每次定下一个串,然后上面那个串向左移动就行了

代码如下:

#include <bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f

int main() {
//	freopen("in.txt","r",stdin);
	string a,b;
	int len;
	while(cin >> a >> b){
		int alen = a.size();
		int blen = b.size();
		len = alen+blen;
		
		for(int i = 0; i < alen; i++){
			int nlen = alen-i;
			int minl = min(nlen,blen);    //每次都只有minl这么长重合,为什么?思考一下
			int ok = 1;
			for(int j = 0; j < minl; j++){
				if(a[i+j]-'0'+b[j]-'0' > 3){ok = 0;break;}
			}
			if(ok) len = min(len,blen+alen-minl);
		}
		for(int i = 0; i < blen; i++){
			int nlen = blen-i;
			int minl = min(nlen,alen);
			int ok = 1;
			for(int j = 0; j < minl; j++){
				if(b[i+j]-'0'+a[j]-'0' > 3){ok = 0;break;}
			}
			if(ok) len = min(len,blen+alen-minl);
		}
		printf("%d\n",len);
	}
		
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值