AcWing 1117 单词接龙
题目描述:
单词接龙是一个与我们经常玩的成语接龙相类似的游戏。
现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”,每个单词最多被使用两次。
在两个单词相连时,其重合部分合为一部分,例如 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 单词接龙相关推荐
- 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs
题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...
- 1117. 单词接龙
单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. 在两个单词相连时,其重 ...
- 【c++】单词接龙(暴搜)
1117. 单词接龙 单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. ...
- 单词接龙acwing
单词接龙是一个与我们经常玩的成语接龙相类似的游戏. 现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙",每个单词最多被使用两次. 在两个单词相连时,其重 ...
- 【每日一算法】单词接龙
微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
- 洛谷 P1019 单词接龙 (DFS)
题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...
- P1019 单词接龙 (DFS)
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
- 洛谷——P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
最新文章
- php中创建关联数组,以及遍历数组
- 谷歌云TPU服务正式全面开放:「AlphaGo背后的芯片」进入商用化
- 罗辑思维 - 当代的学习方法
- Spring在web中的使用
- 我要3万取款机怎么取_7万的新宝骏RS-3怎么样?用车三个月后,车主说出了实话...
- jboss4。0下mysql数据源的配置
- cpuz测试分数天梯图_2015最新cpu天梯图 cpu性能排行榜
- IDEA 之because it is included into a circular dependency循环依赖的解决办法
- 从技术新趋势到云原生应用开发,云计算下一个十年将走向何方
- 机器学习之信用卡欺诈检测
- Linux查看gzip文件原始大小,Linux 文件管理:Linux gzip 压缩
- 班级小工具一【微信接龙】
- OpenCV切割图片
- python 因子分析_因子分析在python上的实现
- linux下使用mplayer观看高清电影
- 基于springboot+vue的商城系统(电商平台)(前后端分离)
- pcf8563 C语言编程
- 关于VM一启动虚拟机电脑就重启或蓝屏的几个解决方法
- Flowable入门系列文章193 - 禁用批量插入和安全脚本
- MySQL 字符串截取操作
热门文章
- Excel怎么把数字样式日期转为标准日期格式
- javascript案例31——简易ATM机、简易银行、存钱取钱。
- collection集合 厂家_一篇搞定Java集合类原理-WEB资讯专栏-DMOZ中文网站分类目录
- Unity 获得Animator下某个动画片段的时长
- AD PCB设计入门总结(二)
- 什么是好产品?如何评价产品?谈产品评价体系模型
- python之利用Pygal+2010年世界人口=绘制世界地图
- RollBack RX Professional 设置快照教程
- OpenCore Configurator for Mac(黑苹果系统引导工具)
- 使用Matlab2019b测试音频系统的频响(FreqResponse)与脉冲响应(ImpulseResponse)