Luogu P1278 单词游戏(dfs)
题意
题目描述
\(Io\)和\(Ao\)在玩一个单词游戏。
他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。
游戏可以从任何一个单词开始。
任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。
游戏的复杂度定义为游戏中所使用的单词长度总和。
编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
输入输出格式
输入格式:
输入文件的第一行,表示一个自然数\(N(1 \leq N \leq 16)\),\(N\)表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母\(A\)、\(E\)、\(I\)、\(O\)和\(U\)组成的一个字符串,每个单词的长度将小于等于\(100\),所有的单词是不一样的。
输出格式:
输出文件仅有一行,表示该游戏的最大可能复杂度。
输入输出样例
输入样例:
5
IOO
IUUO
AI
OIOOI
AOOI
输出样例:
16
思路
骗分过样例,暴力出奇迹! --sbw
骗分用爆搜过了一道记忆化搜索题,有点开心。
这题的爆搜其实十分好写,而\(n\)又很小,不过细细想来,如果每次\(dfs\)时全部跑满,时间复杂度是\(O(n!)\)的,那么对于最大的数据范围:
\]
显然就会爆炸。那么想想,出题人会怎么卡你呢?首先,他可以做一个环:
IOI
IOOI
IOOOI
IOOOOI
IOOOOOI
...
这样的话每种情况都能转移到,就会把爆搜的时间复杂度跑满。针对这样的出题人,我们只需要记录所有字符串的长度和(也就是最大可能答案),一旦搜到就赶紧退出,就不会\(TLE\)了。
狡猾的出题人也想到了这一点,于是造出了这样的数据:
UE
IOI
IOOI
IOOOI
IOOOOI
IOOOOOI
...
不过这也好办,我们在总长度中减去永远不会遍历到的字符串来更新就好了。
于是这题就被这么水了过去...
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,ans,sum,len[20];
string str[20];
bool vis[20],ok[20];
vector<int>G[20];
void dfs(int now,int step)
{
if(ans==sum) return ;
ans=max(ans,step);
for(int i=0;i<G[now].size();i++)
if(!vis[G[now][i]])
{
vis[G[now][i]]=true;
dfs(G[now][i],step+len[G[now][i]]);
vis[G[now][i]]=false;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>str[i];
sum+=(len[i]=str[i].length());
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i!=j&&str[i][len[i]-1]==str[j][0])
{
ok[i]=ok[j]=true;
G[i].push_back(j);
}
for(int i=0;i<n;i++) if(!ok[i]) sum-=len[i];
for(int i=0;i<n;i++)
{
if(!ok[i]) continue;
vis[i]=true;
dfs(i,len[i]);
vis[i]=false;
if(ans==sum) break;
}
cout<<ans;
return 0;
}
Luogu P1278 单词游戏(dfs)的更多相关文章
- 洛谷 P1278 单词游戏
P1278 单词游戏 题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单 ...
- 洛谷 P1278 单词游戏 【状压dp】
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- LUOGU 1278 单词游戏
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- P1278 单词游戏
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- Luogu P2664 树上游戏 dfs+树上统计
题目: P2664 树上游戏 分析: 本来是练习点分治的时候看到了这道题.无意中发现题解中有一种方法可以O(N)解决这道题,就去膜拜了一下. 这个方法是,假如对于某一种颜色,将所有这种颜色的点全部删去 ...
- [洛谷P1278]单词游戏
题目大意:给一个有$n(n\leqslant16)$个单词的字典,求单词接龙的最大长度 题解:发现$n$很小,可以状压,令$f_{i,j}$表示选的数的状态为$i$,最后一个字母是$j$的最大长度. ...
- [luogu]P1070 道路游戏[DP]
[luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- 题解 P1278 【单词游戏】
前言 首先,看到这道题目,我首先想到的是暴搜,通过\(vector\)来搞,代码也是很短的. 这里用了一个类似于分治的思想 把一个大问题转化为小问题 先枚举第一个单词,之后把能拼接在它后面的单词都一个 ...
随机推荐
- 5.1_Spring Boot2.x安装Docker
1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker 是一个开源的应用容器引擎,基于Go 语言并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用 ...
- 建立 CRAMFS 包
下载 cramfs 工具 从 http://prdownloads.sourceforge.net/cramfs/cramfs1.1.tar.gz下载源代码包. 把下载包拷贝到 dev_home/t ...
- 【学术篇】NOIP2016 D1T3 luogu1850换教室
题目链接:点击这里献出你宝贵的时间(是用来做题不是捐赠Emmmm).. Emmmm我太弱了= = 做完这题我觉得我应该去打星际..这题怎么就有重边了呢.. 这题就是一道期望= =当时考场上好像完全不会 ...
- 如何在Vue项目中使用Element组件
[前提] 1.安装webpack cnpm install webpack -g 2.安装vue/vue-cli cnpm install vue vue-cli -g 3.初始化vue ...
- Android开发 WebView的详解
前言 WebView 是Android显示html内容的主要方式,当然TextView也可以加载html内容.但是WebView除了功能更加强大,最重要的是还能调用Html里的JavaScript语言 ...
- maven相互依赖导致无法编译成功
起初是新加了个模块,启动前编译时error,提示找不到依赖模块的类,但java文件上是没有报错的. 后经过排查,发现是循环依赖导致的此问题. 如图,弹出框中有循环依赖的模块会显示红色,右键Open M ...
- JavaSE_12_序列化流和打印流
1.1 序列化流概述 Java 提供了一种对象序列化的机制.用一个字节序列可以表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等信息.字节序列写出到文件之后,相当于文件中持久保存 ...
- shell学习笔记2: shell中的四则运算符
shell中的四则运算符 n1,n2 :常量数字 char:运算符号 加,减,乘,除,取余(+,-,*,/,%) $a,$b:变量a,变量b 方法1 数字与符号之间需要有空格 不支持小数 expr n ...
- centos7 搭建 php7 + nginx (2)
安装php php下载地址 # 避免出错,先安装下面 yum install libzip libzip-devel libxml2-devel openssl openssl-devel bzip2 ...
- Installer - 使用Maven自动布署至外部Tomcat
一.配置相关文件 1.配置tomcat的conf/tomcat-users.xml文件 <tomcat-users> <role rolename="manager-scr ...