题目选自洛谷P1019

首先在题意上可能有些误解。

  • 两个单词合并时,合并部分取的是最小重叠部分

  • 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。

  • 每个单词最多出现两次.

(其实也就是读题问题。这些都是我所犯的错误,希望大家能注意一下)

好了。然后是解题思路。

首先是预处理,用yc[i][j]来存储 第i个单词 后连接 第j个单词 的 最小重叠部分(mt函数)

后来预处理完了之后就是深搜:

先从第一个到最后一个单词看一看哪个单词是指定字母为开头的,作为深搜的第一个单词,同时标记使用过一次(vis[i]++)

然后继续搜吧。

题目背景

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。

输入格式

输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。

输出格式

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

输入输出样例

输入 1

5
at
touch
cheat
choose
tact
a

输出 1

23

说明/提示

样例解释:连成的“龙”为 atoucheatactactouchoose

n≤20

解题代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int n;//单词数
string tr[30];//存储字符串
int yc[30][30];//两个字母的最小重叠部分
int vis[30];//判断单词使用频率.
int mt(int x, int y){//mt函数,返回x单词后连接一个y单词的最小重叠部分 bool pp=true; int ky=0;for(int k=tr[x].size()-1;k>=0;k--){//从x单词尾部向前看看最小重叠部分是从哪里开始的,以为因为是倒着来,所以保证是最小的 for(int kx=k;kx<tr[x].size();kx++){/ if(tr[x][kx]!=tr[y][ky++]){pp=false;break;}}if(pp==true){//如果说当前以k为开头的前一个单词后缀 ,是后面单词的前缀,就马上返回重叠部分。(tr[x].size()-k是找出来的规律)return tr[x].size()-k;        } ky=0;pp=true;//不行就继续}return 0;
}//可能这里有点难理解。可以手动模拟一下
char ch;//开头字母
int ans=-1;//答案
int an=0;//每次搜到的当前最长串
void dfs(int p){//p为尾部单词编号(p的后缀就是“龙”的后缀,因为p已经连接到”龙“后面了)bool jx=false; for(int j=1;j<=n;j++){if(vis[j]>=2) continue;//使用了两次就跳过 if(yc[p][j]==0) continue;//两单词之间没有重合部分就跳过 if(yc[p][j]==tr[p].size() || yc[p][j]==tr[j].size()) continue;//两者存在包含关系就跳过 an+=tr[j].size()-yc[p][j];//两单词合并再减去最小重合部分 vis[j]++;//使用了一次jx=true;//标记一下当前已经成功匹配到一个可以连接的部分 dfs(j); //接上去an-=tr[j].size()-yc[p][j];//回溯,就要再减回去那一部分长度 vis[j]--;//回溯,使用-- }if(jx==false){//jx==false说明不能再找到任何一个单词可以相连了 ans=max(ans,an);//更新ans }return;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)cin>>tr[i];cin>>ch; for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){yc[i][j]=mt(i,j); }}//预处理yc数组。yc[i][j]就表示,i单词后连接一个j单词的最小重叠部分 //比如 i表示at,j表示att. yc[i][j]就为2 但是yc[j][i]就为0.//预处理是一个关键for(int i=1;i<=n;i++){//从头到尾看一下有没有以指定开头字母为开头的单词 if(tr[i][0]==ch){//如果有,就以当前单词为基准进行搜索。 vis[i]++;//使用过一次 an=tr[i].size();//更新当前串长度 dfs(i);//接上vis[i]=0;//消除影响 } } printf("%d",ans);return 0;
}

深度优先搜索——单词接龙(洛谷 P1019)相关推荐

  1. 深度优先搜索——八皇后问题(洛谷 P1219)

    题目选自洛谷P1219     该题针对6-13皇后都行,只需改动输入的数字. 八皇后问题是经典的DFS问题,唯一需要注意的就是判断能够放置的条件,即满足什么状况是对的. 题目要求不能在同一行,同一列 ...

  2. 普及练习场 深度优先搜索 单词接龙

    题意理解 这题目,如果裸写dfs的话,可能会比较烦,所以需要预处理一下.这个预处理还是很关键的,我昨天没有想到预处理,然后心态就很爆炸,什么都没有写出来. 另外,还有很重要的一点是,对于开始位置的处理 ...

  3. DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

    一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...

  4. 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙

    [题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...

  5. 【DFS+回溯+字符串】【洛谷P1019】【单词接龙】

    传送门 /*[DFS+回溯+字符串][洛谷P1019][单词接龙]https://www.luogu.com.cn/problem/P1019题意:给你很多个单词 一个开头首字母 每个单词至多用2次 ...

  6. 洛谷 [P1019 单词接龙] {搜索|DFS} 奋斗的珂珂~

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

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

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

  8. 【搜索】NOIP2000 or 洛谷1019单词接龙

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

  9. 洛谷P1019 单词接龙

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

最新文章

  1. log4j2配置实例[按小时记录日志文件]
  2. python中pos的用法_Python正则式的基本用法
  3. python2.7 升级到 python3.6
  4. 【响应式Web前端设计】!important的用法及作用
  5. 关于运算符operator重载出错解决方法
  6. 通信线路工程验收规范 gb51171-2016_老杨一建通信学堂通信线路工程施工技术
  7. 盘一盘 synchronized (一)—— 从打印Java对象头说起
  8. ASP.NET模拟其他用户进行关机
  9. ubuntu atpdpkg
  10. 微信小程序实现下拉刷新
  11. Ubuntu18.04 关闭和开启图形界面
  12. 支持向量回归(多核函数)
  13. 为什么html中图片显示不出来,网页图片显示不出来怎么办
  14. 计算机老师新年贺卡祝福语,老师新年贺卡祝福语
  15. uni-app 上传图片到七牛云
  16. 自己是一滩烂泥,却恨铁不成钢
  17. Linux系统下海康机器人MVS安装
  18. APS炒币机器人投资随记1:与时俱进,跟随趋势,方能立足
  19. javascript排序_鸡尾酒用javascript排序
  20. 图标icons网站--各种很好用的图标

热门文章

  1. bada 2D游戏编程之一——图形绘制
  2. 错误913:未能找到ID为13的数据库。可能该数据库尚未激活,也可能正在转换过程中...
  3. 卡巴斯基误杀奇虎360
  4. 利用Office Chart 制作柱图(一个柱子)
  5. Arcpy报错及解决——持续补充中
  6. emacs 替换模式_如何使用Emacs Org模式撰写博客
  7. 巴萨队徽_巴塞罗那选择Linux,Apple的Lisa OS开源,更多新闻
  8. ssh tar_2015年最佳情侣:tar和ssh
  9. Linus Torvalds的安全性,Facebook的AI工具等
  10. (26)ESLint一JS代码格式校验