1704 單詞接龍

2022-10-09 01:51:14 字數 2287 閱讀 1733

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」**現兩次),在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at和atide間不能相連。

輸入的第一行為乙個單獨的整數n(1<=n<=12)表示單詞數,以下n行每行有乙個單詞(只含有大寫或小寫字母,長度不超過20),輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在。

只需輸出以此字母開頭的最長的「龍」的長度。

5

attouch

cheat

choose

tact

a

23

連成的「龍」為atoucheatactactouchoose

講這題前,要用到乙個stl裡很好用的東西——————string

可以簡單把它理解成乙個字串陣列,一切操作都已經包裝好了的,特別好用。妙啊~~~~~ (不知道的可參考string基本應用)

這道題我們主要用的是substr這個操作 :提取字串中的一段字串,用法 字串名.substr(擷取起點,字串長度)

開始進入正題。題目要求讓接出來的龍最長,所以我們就要使重疊部分最少

e.g. akioihhh hhhioinb 。最長的應該是 akioihhhhhioinb (之重疊了乙個h),而不是akioihhhhioinb(重疊了兩個h)

所以,在輸入完了之後,我們可以初始化,定義乙個二維陣列k[i][j],用來記錄字串i與字串j最少重疊的部分。用乙個函式csh來初始化,求出每乙個字串與其它字串最少重疊部分。

int csh(string x,string y)

} return 0;//說明沒有重疊部分,返回0

}

開始列舉每乙個字串,如果字串開頭的字元與要求開頭字元不符,就直接跳過continue.因為題目條件要求的是乙個字串最多出現兩次,所以我們的vis標記陣列,就有三種狀態,即:0(未被使用),1(使用了1次),2(使用了2次)。列舉到這個字串時,vis[i]++,再進入dfs,最後vis[i]--.

接下來就是dfs列舉的過程了。用x來記錄目前是第幾個字串,len記錄當前「龍」的長度。進入dfs的時候,先將答案便量與len取最大max.

再進行與後續字串的接龍。

如果,列舉到的字串已經被使用過2次了 或者這個字串與列舉的字串沒有重疊部分(即:k[x][i] = 0) 就直接跳過。接下來就進入下一層dfs,vis[i]++,x傳入為i,長度傳入為當前的len加上字串i的長度減去重疊部分,再vis[i]--。

ok,一切準備工作完成,題目就做完了!!

#include using namespace std;

int n,anslen = 0;//anslen答案長度

string s[20];//字串陣列

int vis[1000000],k[20][20];

//vis標記陣列,k記錄每兩個字串間最少的重疊部分

int csh(string x,string y)

} return 0;//說明沒有重疊部分,返回0

}void dfs(int x,int len)//如果此字串被使用兩次 或 沒有與當前字串有重疊部分,直接跳過

vis[i]++;//使用次數++

dfs(i,len + s[i].length() - k[x][i]);

//x -> 當前列舉字串

//len -> len加上字串i的長度再減去重疊部分

vis[i]--;//取消標記; }}

int main()

}//初始化,字串i與其它字串的最少重疊部分

for (int i = 1;i <=n;i++)//如果開頭與要求字元不一樣直接跳過

vis[i]++;//此字串使用一次

dfs(i,s[i].length());//進入dfs

vis[i]--;//取消標記 }

printf("%d",anslen);

return 0;

}

1018 單詞接龍

題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...

1220 單詞接龍

題目 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分...

zufeoj 單詞接龍

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存...