單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」**現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at 和 atide 間不能相連。
輸入的第一行為乙個單獨的整數n (n≤20)表示單詞數,以下n 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.
只需輸出以此字母開頭的最長的「龍」的長度
輸入 #15at
touch
cheat
choose
tact
a輸出 #1
(連成的「龍」為atoucheatactactouchoose)
noip2000提高組第三題
這個題真的反思良多,遞迴一直是我的弱項,而以遞迴為基礎的dfs更是心病,解這道題所遇到的問題或反思且聽我細細道來:
1. 資料結構
別總就想著用那些現成的容器,就拿vector來說,確實很方便可是陣列或字串一樣可以啊,用了vector以後,各個函式的介面處的資料型別轉換會磨完你的信心;
2.函式介面
在寫演算法的時候不要糾結於各個細節函式的實現,如果在寫演算法的時候需要某項功能,請先假設此功能函式已實現, 並想清楚在此演算法中該函式到底需要什麼引數和返回值,函式的介面很重要,先完成演算法,再寫功能函式,先整體後區域性,不然具體功能函式的實現會打斷演算法的思路!
3.深度優先搜尋中的回溯
回溯之後會不會又走進這個分支?這不就是死迴圈了麼?顯然沒有!那麼回溯之後又沒有標記,電腦是怎麼知道該換分支了呢?答案就在dfs函式中的for迴圈上, for迴圈的i值一直在變,這本身就是一種標記了!(剛開始寫回溯演算法的時候沒寫迴圈可真是愁死個人~)
#include
using
namespace std;
class
nodee
//建構函式,順便初始化num
string vel;
int num;
//每個單詞最多使用兩次};
nodee a[21]
;int n, maxx =1;
intfindd
(string a, string b)
//輸出最少重複
if(flag)
return i;
}return0;
}int
dfs(string s,
int len)
//深度優先搜尋
} maxx =
max(maxx, len)
;//更新最大長度
return maxx;
}int
main()
P1019 單詞接龍(DFS 回溯)
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast 和 astonishastonish 如果接成一條龍則變為 beast...
P1019 單詞接龍
洛谷 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部...
P1019 單詞接龍
p1019 單詞接龍 首先需要找到任意兩個單詞的最小重合長度 從前面單詞的尾部比較,依次增加尾部選取長度,直至找到選取尾部和下乙個單詞頭部相同,就找到了最小重合長度。再通過dfs搜尋。includeusing namespace std int n,sum 0 char str 20 50 ch s...