UVa——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;
}

猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80218506