【bzoj1789】 [Ahoi2008]Necklace Y型項鍊

Description

歡樂島上衆多新奇的遊樂項目讓小可可他們玩的非常開心。現在他們正在玩比賽串項鍊的遊戲,誰串的最快就能得到優厚的獎品。這可不是普通的項鍊,而是一種Y型項鍊,項鍊的最中間有一顆大珍珠作爲結合點,從大珍珠上連出來3條由各種寶石串起來的鏈子。比賽的規則是這樣的:每次可以從三條鏈子中某一條的一端取下來一個寶石,或者安上去一個寶石,稱爲一次操作,經過若干次操作,最終使得三條鏈子完全相同。想要贏得比賽,那麼只能使用盡量少的操作次數。假設每種寶石都有無數多個以供使用,且鏈子足夠長。你能幫助小可可贏得比賽嗎? 注:由於對Y型項鍊的寶石數沒有特殊的要求,所以即使你把所有寶石都取下來,也是一個可以接受的方案(三根沒有串寶石的繩子也是完全一樣的).

Input

一共有3行,表示Y型項鍊的三條鏈子,每行開始有一個數字N,表示初始時這條鏈子上串有N個寶石(N<=50),隨後是一個空格,然後是N個'A'和'Z'之間的字符,表示這個鏈子上的寶石,每個字母表示一種不同的寶石,這個字符串最左邊的字符表示的是離大珍珠最近的那個寶石,而最右邊的表示的是在鏈子末端的寶石。

Output

只有一個整數,表示所需要的最少的操作次數.

Sample Input

3 CAT
3 TAC
5 CATCH

Sample Output

8

HINT

提示:100%的數據中,N<=50.
50%的數據中,N<=20.

【解析】
很水的一道題……
因爲只有三個串,所以每兩個串求最長公共前綴,然後刪除掉其他亂七八糟的寶石,求代價

最後勒,就輸出最小的代價就好了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n[5],d=6;
char s[5][51];
int change(int x,int y)
{
    int p=1,q=1;
    while(p>0 && p<=n[x] && p<=n[y] && s[x][p]==s[y][p]) p++;
    p--;
    while(q>0 && q<=p && q<=n[d-x-y] && s[x][q]==s[d-x-y][q]) q++;
    q--;
    return n[x]-p + n[y]-p + n[d-x-y]-q + p-q;
}
int main()
{
    int n1,n2,n3;
    scanf("%d%s%d%s%d%s",&n[1],s[1]+1,&n[2],s[2]+1,&n[3],s[3]+1);
    int ans=999999999;
    ans=min(ans,change(1,2));
    ans=min(ans,change(1,3));
    ans=min(ans,change(2,3));
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章