信息学奥赛一本通(1220:单词接龙)
?
1220:單詞接龍
時(shí)間限制: 1000 ms ??? ??? 內(nèi)存限制: 65536 KB
提交數(shù): 5368 ??? 通過(guò)數(shù): 3159
【題目描述】
單詞接龍是一個(gè)與我們經(jīng)常玩的成語(yǔ)接龍相類(lèi)似的游戲,現(xiàn)在我們已知一組單詞,且給定一個(gè)開(kāi)頭的字母,要求出以這個(gè)字母開(kāi)頭的最長(zhǎng)的“龍”(每個(gè)單詞都最多在“龍”中出現(xiàn)兩次),在兩個(gè)單詞相連時(shí),其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變?yōu)閎eastonish,另外相鄰的兩部分不能存在包含關(guān)系,例如at和atide間不能相連。
【輸入】
輸入的第一行為一個(gè)單獨(dú)的整數(shù)n(n<=20)表示單詞數(shù),以下n行每行有一個(gè)單詞(只含有大寫(xiě)或小寫(xiě)字母,長(zhǎng)度不超過(guò)20),輸入的最后一行為一個(gè)單個(gè)字符,表示“龍”開(kāi)頭的字母。你可以假定以此字母開(kāi)頭的“龍”一定存在。
【輸出】
只需輸出以此字母開(kāi)頭的最長(zhǎng)的“龍”的長(zhǎng)度。
【輸入樣例】
5 at touch cheat choose tact a【輸出樣例】
23【分析】
? ? ? ? 以樣例數(shù)據(jù)為例,構(gòu)造兩兩單詞接龍重疊字符矩陣,再根據(jù)該矩陣構(gòu)造遞歸解答樹(shù),如下圖
? ? ? ? at 可以和 touch 或 tact 相連,長(zhǎng)度分為6 或 5,而 touch 則可以和 cheat 或 choose 進(jìn)行相連,長(zhǎng)度為9 或 10,...
? ? ? ? 以此類(lèi)推,最長(zhǎng)的龍為:atoucheatactactouchoose。注意:每個(gè)單詞都最多在“龍”中出現(xiàn)兩次。
? ? ? ? 這道題用C++代碼要簡(jiǎn)單一些,有關(guān)字符串的代碼,用C語(yǔ)言非常困難。
感謝題解:https://www.cnblogs.com/-xiangyang/p/9220236.html
【參考代碼】
#include<bits/stdc++.h> using namespace std; const int MAXN=50; string str[MAXN]; int n,used[MAXN]; int ans=0; int check(string a,string b)//查找想同的部分長(zhǎng)度 {int la=a.size(),lb=b.size();int l=min(la,lb);for(int i=1;i<l;i++) {int flag = 1;for (int j = 0; j < i; j++){if(a[la-i+j]!=b[j])flag=0;}if(flag) return i;}return 0; } void dfs(string s,int len) {ans=max(ans,len);for(int i=0;i<n;i++){if(used[i]>=2) continue;int c=check(s,str[i]);if(c>0) {used[i]++;dfs(str[i],len+str[i].size()-c);used[i]--;}}} int main() {cin>>n;getchar();for(int i=0;i<n;i++) {cin>>str[i];getchar();used[i]=0;}string s;cin>>s;dfs(' '+s,1);cout<<ans<<endl;return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1220
?
總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通(1220:单词接龙)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信息学奥赛一本通(1197:山区建小学)
- 下一篇: 数论 —— 概述