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\)来搞,代码也是很短的. 这里用了一个类似于分治的思想 把一个大问题转化为小问题 先枚举第一个单词,之后把能拼接在它后面的单词都一个 ...
随机推荐
- Python flask 构建微电影视频网站✍✍✍
Python flask 构建微电影视频网站 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- 「APIO 2019」奇怪装置
题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...
- Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1
Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...
- 使用CEfSharp之旅(5)CEFSharp 隔离Cookie
原文:使用CEfSharp之旅(5)CEFSharp 隔离Cookie 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https:/ ...
- Android开发 BottomNavigationView学习
前言 注意这个里介绍的是AndroidX的com.google.android.material.bottomnavigation.BottomNavigationView xml布局中 <co ...
- android 头像选择以及裁剪
一.布局申明 <ImageView android:id="@+id/head_image" android:layout_width="80dp" an ...
- Http协议之content
用android 通过http协议提交数据至服务器 content的内容 代码如下: private static JSONObject connUpload(String baseUrl, Map& ...
- 移动端开发框架Zepto.js
一.概述 Zepto.js是一个轻量的js库,它与jQuery有类似的API. zepto的设计目的是不到10K的通用库,快速下载,有一个熟悉的api-->精力专注在开发上. 流行起来的原因:轻 ...
- rsync命令集合
rsync -avz rsync://logs@211.151.78.206/www_logs/2014/03/27/* /mnt/hgfs/iautoslogs/
- C++面向对象高级编程(下)第二周-Geekband
17,对象模型:关于vptr(vitrual Pointer)和vtbl(virtual Table) 当存在虚函数就会出现虚指针vptr指向虚函数所在位置vtbl 将vptr实现vtbl内容翻译为C ...