P1019 單詞接龍

2021-10-03 03:37:12 字數 1185 閱讀 7272

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

輸入的第一行為乙個單獨的整數nn (n \le 20n≤20)表示單詞數,以下nn 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.

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

輸入

5

attouch

cheat

choose

tact

a

輸出

23
首先這道題利用的是乙個dfs+回溯(也可以不用回溯,將當前的「龍」的長度也作為引數在dfs函式中傳遞即可)的思想。

1.首先利用乙個鄰接表儲存各個字串之間的最小重合部分。(注意!這裡取最小重合部分,才能保證最終的「龍」最長)

2.dfs遍歷所有可能的情況,儲存最長「龍」的長度。

#include#includeusing namespace std;

string str[20];

char head;

int n, sum = 0, maxl = 0;

int map[20][20];

int len[20];

int vis[20];

void init()

pos++;

}if (flag)

pos = 0;

flag = 1;

}} }

}void dfs(int i)

} if (flag)

maxl = (sum > maxl) ? sum : maxl;

}int main()

cin >> head;

init();

for (int i = 0; i < n; i++) }

cout << maxl << endl;

return 0;

}

P1019 單詞接龍

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

P1019 單詞接龍

p1019 單詞接龍 首先需要找到任意兩個單詞的最小重合長度 從前面單詞的尾部比較,依次增加尾部選取長度,直至找到選取尾部和下乙個單詞頭部相同,就找到了最小重合長度。再通過dfs搜尋。includeusing namespace std int n,sum 0 char str 20 50 ch s...

P1019 單詞接龍

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