我的思路是A右与B左对齐,然后一路滑过去,寻找其中的最小值。然而WA。。
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <cctype> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define debug printf("! ") #define INF 10000 #define MAXN 5010 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long char a[110],b[110]; int main() { while(~sf("%s",a)) { int i,j,aa,bb; sf("%s",b); int al = strlen(a); int bl = strlen(b); int m = al+bl; int len = MAX(al,bl); for(i=-bl+1;i<al;i++) { int k = 0,tmp; for(j = 0;j<bl;j++) { if(i+j<0 || i+j>=al) { aa = 0; bb = b[j]-'0'; } else { aa = a[i+j]-'0'; bb = b[j]-'0'; } if(aa+bb>3) break; if(i+j<0 || i+j>=al) k++; } if(j==bl) { pf("k%d ",k); if(k) tmp = len+k-1; else tmp = len; pf("tmp%d ",tmp); if(m>tmp) m = tmp; } } pf("%d ",m); } } /* 2112112112 2212112 12121212 21212121 2211221122 21212 2221 12111 */
看了一下别人的思路,是左端对齐,两个分别滑动,然后遇到一个匹配就break,求其中较小那个
http://www.cnblogs.com/wuyuewoniu/p/4345571.html
效率上这个方法肯定比我的好,就是不知道我的WA在哪,先摆在这