题目描述:

单词接龙是一个与我们经常玩的成语接龙相类似的游戏。

现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”,每个单词最多被使用两次。

在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。

我们可以任意选择重合部分的长度,但其长度必须大于等于1,且严格小于两个串的长度,例如 at 和 atide 间不能相连。

输入格式

输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。

你可以假定以此字母开头的“龙”一定存在。

输出格式

只需输出以此字母开头的最长的“龙”的长度。

数据范围

n≤20

输入样例:

5
at
touch
cheat
choose
tact
a

输出样例:

23

提示

连成的“龙”为 atoucheatactactouchoose。

分析:

本题dfs的过程为,int dfs(u)表示从单词u出发能够构成的最长接龙的长度,对当前的单词u,找到能接到后面的单词i以及接到后面重合的字母个数j,dfs(u) = max(dfs(i) - j) + u.size()。当然,很重要的一点是比如b可以接到a后面,我们会选择两个单词重合度最少的去接龙,因为重合的少,连起来就会更长,这点对dfs格外重要,不需要遍历b能接到a后面所有的情况,只需要遍历b接到a后面最长的长度。另外需要一个cnt数组存储每个单词已经出现的次数,当当前单词扩展完成后,回溯到上一步前还需要恢复该单词的cnt状态。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 22;
int n,cnt[N],ans = 0;
string w[N];
int dfs(int u){int res = 0;cnt[u]++;for(int i = 0;i < n;i++){if(cnt[i] >= 2) continue;int p = w[u].size() - 1,q = w[i].size() - 1;for(int j = 1;j <= p && j <= q;j++){if(w[u].substr(p-j + 1) == w[i].substr(0,j)){res = max(res,dfs(i) - j);break;}}}cnt[u]--;return res + w[u].size();
}
int main(){cin>>n;for(int i = 0;i < n;i++)    cin>>w[i];char c;cin>>c;for(int i = 0;i < n;i++){if(w[i][0] == c){ans = max(ans,dfs(i));}    }cout<<ans<<endl;return 0;
}

当然,也可以提前预处理好那些单词可以连在一起,如果两个单词可以连在一起,就连一条边,在dfs时直接调用边长即可。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 22;
int n,cnt[N],g[N][N],ans = 0;
string w[N];
int dfs(int u){int res = 0;cnt[u]++;for(int i = 0;i < n;i++){if(cnt[i] >= 2) continue;if(g[u][i]) res = max(res,dfs(i) - g[u][i]);}cnt[u]--;return res + w[u].size();
}
int main(){cin>>n;for(int i = 0;i < n;i++)    cin>>w[i];for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){int p = w[i].size()-1,q = w[j].size() - 1;for(int k = 1;k <= p && k <= q;k++){if(w[i].substr(p- k + 1) == w[j].substr(0,k)){g[i][j] = k;break;}}}}char c;cin>>c;for(int i = 0;i < n;i++){if(w[i][0] == c){ans = max(ans,dfs(i));}    }cout<<ans<<endl;return 0;
}

AcWing 1117 单词接龙相关推荐

  1. 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs

    题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...

  2. 1117. 单词接龙

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. 在两个单词相连时,其重 ...

  3. 【c++】单词接龙(暴搜)

    1117. 单词接龙 单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. ...

  4. 单词接龙acwing

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. 在两个单词相连时,其重 ...

  5. 【每日一算法】单词接龙

    微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...

  6. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  7. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  8. P1019 单词接龙 (DFS)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  9. 洛谷——P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

最新文章

  1. php中创建关联数组,以及遍历数组
  2. 谷歌云TPU服务正式全面开放:「AlphaGo背后的芯片」进入商用化
  3. 罗辑思维 - 当代的学习方法
  4. Spring在web中的使用
  5. 我要3万取款机怎么取_7万的新宝骏RS-3怎么样?用车三个月后,车主说出了实话...
  6. jboss4。0下mysql数据源的配置
  7. cpuz测试分数天梯图_2015最新cpu天梯图 cpu性能排行榜
  8. IDEA 之because it is included into a circular dependency循环依赖的解决办法
  9. 从技术新趋势到云原生应用开发,云计算下一个十年将走向何方
  10. 机器学习之信用卡欺诈检测
  11. Linux查看gzip文件原始大小,Linux 文件管理:Linux gzip 压缩
  12. 班级小工具一【微信接龙】
  13. OpenCV切割图片
  14. python 因子分析_因子分析在python上的实现
  15. linux下使用mplayer观看高清电影
  16. 基于springboot+vue的商城系统(电商平台)(前后端分离)
  17. pcf8563 C语言编程
  18. 关于VM一启动虚拟机电脑就重启或蓝屏的几个解决方法
  19. Flowable入门系列文章193 - 禁用批量插入和安全脚本
  20. MySQL 字符串截取操作

热门文章

  1. Excel怎么把数字样式日期转为标准日期格式
  2. javascript案例31——简易ATM机、简易银行、存钱取钱。
  3. collection集合 厂家_一篇搞定Java集合类原理-WEB资讯专栏-DMOZ中文网站分类目录
  4. Unity 获得Animator下某个动画片段的时长
  5. AD PCB设计入门总结(二)
  6. 什么是好产品?如何评价产品?谈产品评价体系模型
  7. python之利用Pygal+2010年世界人口=绘制世界地图
  8. RollBack RX Professional 设置快照教程
  9. OpenCore Configurator for Mac(黑苹果系统引导工具)
  10. 使用Matlab2019b测试音频系统的频响(FreqResponse)与脉冲响应(ImpulseResponse)