竟然没有题解,是人太少了还是太简单了..不过还是把我的贴上去吧,第一次写题解比较随意看不懂见谅..
简单的深搜会超时,所以得优化递归代码。
由于翻硬币时只能翻相邻的两枚,所以两串的不同点个数只能是偶数,我们就可以把它们看成一个个只有两个不同点的子串用递归解决了。容易发现让两个不同点转换的步数就是坐标之差。
ac代码
#include <iostream> #include <bits/stdc++.h> #define Inf 1e7 using namespace std; string a,b; int ans=Inf; int L; int cmp[1005]; //检查从下标k开始的子串是否相同,相同则完成 bool check(int k) { while(cmp[k]==0&&k<L) k++; if(k==L) return true; else return false; } void dfs(int k, int s) { if(check(k)) { ans=min(ans,s); return ; } //找到第一个不同点 while(cmp[k]==0) k++; if(k>=L-1) return ; int k0=k; k++; //找到第二个不同点 while(cmp[k]==0) k++; dfs(k+1,s+k-k0); } int main() { cin>>a>>b; L=(int)a.length(); //a,b串不同处标1 for(int i=0;i<L;i++) if(a[i]==b[i]) cmp[i]=0; else cmp[i]=1; dfs(0,0); cout<<ans<<endl; }