洛谷 p1019 单词接龙
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和 atide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数n(n≤20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度
分析
本题还是一道dfs问题 重要的是如何处理给出的单词 以及如何构建一个dfs
首先我们注意到,想要找到最长的“龙”,根据贪心的原则,重合部分要取最小 比如 asdd 和ddas 这两个“单词”,合起来就是adddas 也就是只重合一个字母 而不是asddas 这一点是需要注意的
首先为了dfs的方便 我们可以构造一个数组 p[i][j] 代表 i 单词在前 j 单词在后的时候会重合多少字母 还是asdd和ddas的例子 如果i 单词是asdd,j 单词是ddas 那么p[i][j]=1,p[j][i]=2
至于构造的方式 看下面的代码就好了 注意一定是最小的重合部分。
代码:
#include<bits/stdc++.h> using namespace std; string s[];
char d;
int n,vis[],p[][],ans=-,an=; void ff(int x,int y)
{
int k,kx;
int ky=;
int flag=;
for(k=s[x].size()-;k>=;k--)
{
for(kx=k;kx<=s[x].size()-;kx++)
{
if(s[x][kx]!=s[y][ky++])
{
flag=;
break;
}
}
if(flag) //只要有重合部分就跳出,这样保证了重合的是最小的
{
p[x][y]=s[x].size()-k;
return;
}
ky=;
flag=;
}
return ;
} void dfs(int x)
{
int i,flag=;
for(i=;i<n;i++)
if(vis[i]<&&p[x][i]!=&&s[x].size()!=p[x][i]&&s[i].size()!=p[x][i])
{
flag=;
an+=s[i].size()-p[x][i];
vis[i]++;
dfs(i);
vis[i]--;
an-=s[i].size()-p[x][i];
}
if(!flag) //如果没有新的单词可以“接龙”,判断是否是更长的“龙”并返回
ans=max(ans,an);
return;
} int main()
{
int i,j;
cin>>n;
for(i=;i<n;i++)
{
cin>>s[i];
}
for(i=;i<n;i++)
for(j=;j<n;j++)
{
ff(i,j);
}
cin>>d;
for(i=;i<n;i++)
{
if(s[i][]==d)
{
vis[i]++;
an=s[i].size(); //不要忘了这一句 而且是 = 不是+=!!
dfs(i);
vis[i]=;
}
}
cout<<ans;
}
洛谷 p1019 单词接龙的更多相关文章
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...
- 洛谷 P1019 单词接龙 (DFS)
题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- [NOIP2000] 提高组 洛谷P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 洛谷——P1019 单词接龙(NOIP2000 T3)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- 洛谷P1019——单词接龙(DFS暴力搜索)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- 洛谷P1019 单词接龙题解(超详细注释)
https://www.luogu.org/problem/P1019 #include<cstdio> #include<cstring> #include<iostr ...
- 洛谷 P1019单词接龙
看吧,多简单啊,没有人受伤的世界完成了. ...
- 洛谷1019 单词接龙 字符串dfs
问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
随机推荐
- hyperledge环境安装
1.安装环境 1)本机安装 前提是已经安装好了docker\docker-compose\go,相应的内容可见 docker-1-环境安装及例子实践 docker官方文档学习-1-Docker for ...
- Luogu5021 [NOIP2018]赛道修建
Luogu5021 [NOIP2018]赛道修建 一棵大小为 \(n\) 的树,边带权.选 \(m\) 条链使得长度和最小的链最大. \(m<n\leq5\times10^4\) 贪心,二分答案 ...
- [Flume]使用 Flume 来传递web log 到 hdfs 的例子
[Flume]使用 Flume 来传递web log 到 hdfs 的例子: 在 hdfs 上创建存储 log 的目录: $ hdfs dfs -mkdir -p /test001/weblogsfl ...
- 前端面试送命题(二)-callback,promise,generator,async-await
前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...
- Arduino Core For ESP8266
如果选择纯C作为ESP8266的开发,有两个途径: 使用乐鑫官方原生的 RTOS-SDK或者NONOS-SDK 使用Arduino IDE 使用PlatformIO 作为一个"Arduino ...
- 朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP
阅读PDF版本 标题有点标题党了,这里说的容易犯错不是Spring AOP的错,是指使用的时候容易犯错.本文会以一些例子来展开讨论AOP的使用以及使用过程中容易出错的点. 几句话说清楚AOP 有关必要 ...
- 2019 年起如何开始学习 ABP 框架系列文章-开篇有益
2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...
- 一次Java内存泄露处理手记
现象 最近项目组从NET平台迁移到Java的Dubbo平台上,由于大家都是Java的生手,发生了蛮多的问题,以后一一记录.现在解决一个遇到的关于Java程序内存泄露的问题. 特别说明 Java萌新,理 ...
- 重装mysql后导致Navicat连接失败
今天重装了mysql数据库,然后再使用navicat去连接数据库的时候,一直报错 1251 Client does not support authentication protocol reques ...
- flask请求流程详解
先看一个流程图: 1.当一个请求进入的时候,Flask框架首先会实例化一个Request Context,封装了请求信息,保存在Request中.生成请求上下文后,Flask框架会将请求上下文推入到_ ...