我们可以发现答案目标串即为某一个串的前缀,所以只要枚举前缀再计算两个串需要转移的距离即可
这种题目不要老往dp上想,要善于利用题目条件
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 using namespace std; 6 string a,b,c; 7 string s; 8 int na,nb,nc; 9 int ans=19991231; 10 int cal(string x,string y) 11 { 12 int i=1; 13 while(x[i]==y[i] && i<x.size() && i<y.size())i++; 14 // cout<<x<<" "<<y<<" "<<i<<endl; 15 i--; 16 return x.size()-i-1+y.size()-i-1; 17 } 18 int main() 19 { 20 cin>>na>>a; 21 cin>>nb>>b; 22 cin>>nc>>c; 23 a="0"+a; 24 b="0"+b; 25 c="0"+c; 26 ans=na+nb+nc; 27 s="0"; 28 for(int i=1;i<=na;i++) 29 { 30 s=s+a[i]; 31 ans=min(ans,cal(s,a)+cal(s,b)+cal(s,c)); 32 } 33 s="0"; 34 for(int i=1;i<=nb;i++) 35 { 36 s=s+b[i]; 37 ans=min(ans,cal(s,a)+cal(s,b)+cal(s,c)); 38 } 39 s="0"; 40 for(int i=1;i<=nc;i++) 41 { 42 s=s+c[i]; 43 ans=min(ans,cal(s,a)+cal(s,b)+cal(s,c)); 44 } 45 printf("%d\n",ans); 46 return 0; 47 }