bzoj1789 Necklace Y型项链

我们可以发现答案目标串即为某一个串的前缀,所以只要枚举前缀再计算两个串需要转移的距离即可

这种题目不要老往dp上想,要善于利用题目条件

 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 }
View Code

 

你可能感兴趣的:(ZOJ)