題三.單詞接龍(27分)
問題描述
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at 和 atide 間不能相連。
輸入
輸入的第一行為乙個單獨的整數n (n<=20)表示單詞數,以下n 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.
輸出
只需輸出以此字母開頭的最長的「龍」的長度
樣例:
輸入at
touch
cheat
choose
tacta輸出
23 (連成的「龍」為atoucheatactactouchoose)
【思路】
回溯法。
可以離線求出j接在i之後的重疊部分c[i][j],這樣就可以把序列的尾巴u以及序列的長度len作為狀態搜尋,否則還要以string為狀態搜尋。
【**】
1 #include2 #include3using
namespace
std;45
const
int maxn = 20+5;6
intn;
7int
c[maxn][maxn];
8int x[maxn],a[maxn]; //
標記//
序列 9
string
words[maxn];
10int
wordslen[maxn];
11int ans=0;12
13//
計算a前b後的重疊長度
14//
substr擷取字串
15int calc(string a,string
b) 22
return0;
23}2425
void dfs(int u,int
len) 32}
33int
main()
39for(int i=0;ifor(int j=0;j//
自己可能與自己重疊
40 c[i][j]=calc(words[i],words[j]);
41char ch; cin>>ch;
42for(int i=0;iif(words[i][0]==ch)
45 cout<46return0;
47 }
NOIP2000 單詞接龍
頹廢了一段時間,現在打算一遍學著數論基礎,一遍做著搜尋之類的題目提高 能力。這道題資料範圍小,是一道典型的搜尋題,但是對解題能力還是有一定要求的。注意是解題能力!我認為,他包括這幾部分 讀題懂題意,化歸到演算法模型上,編寫 處理好細節。讀懂題是解決題目的前提,有時解題時間長 出錯率高不是因為知識掌握...
NOIP2000提高組 單詞接龍
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能...
NOIP 2000 提高組 複賽 單詞接龍
noip 2000 提高組 複賽 單詞接龍 1.程式編寫過程中,發現接龍處的判斷編寫有誤,馬上著手修改。2.樣例通過,提交40分,錯了測試點1 4.輸入 1envelopee 輸出 154.上述測試點是挺經典的,不容易考慮到。envelope envelope 拼接成envelopenvelope ...