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\)来搞,代码也是很短的. 这里用了一个类似于分治的思想 把一个大问题转化为小问题 先枚举第一个单词,之后把能拼接在它后面的单词都一个 ...
随机推荐
- Berlin Programming Contest 2004 Heavy Transportation /// dijkstra oj22604
题目大意: 输入t:t为样例数 每个样例输入n,m:n 为顶点个数 m 为路径数 接下来m行 每行输入 u v w :从 u 点到 v 点的路承重为 w 输出 车子若想通过 1~n的最短路 车重需限 ...
- 如何使用Spark大规模并行构建索引
使用Spark构建索引非常简单,因为spark提供了更高级的抽象rdd分布式弹性数据集,相比以前的使用Hadoop的MapReduce来构建大规模索引,Spark具有更灵活的api操作,性能更高,语法 ...
- Ubuntu环境下使用npm编译从git上clone下来的前端(Javascript)项目
一.更新Ubuntu软件源 打开终端依次输入: $ sudo apt-get update $ sudo apt-get install -y python-software-properties s ...
- CAS机制详解
目录 1. 定义 2. 实现原理 3. 无版本号CAS实战说明 4. CAS机制在Java中的应用 5. CAS的缺点 1. CPU开销过大 2. 不能保证代码块的原子性 3. ABA问题 6. JA ...
- Caffe系列1——网络文件和求解分析
1. 首先,我们先看一个完整的文件:lenet_train_test.prototxt name: "LeNet" #整个网络的名称 layer { #数据层——训练数据 name ...
- git sync tags with remote
git 同步遠程標籤 在 .git/config的 [remote "origin"] 下加了 fetch = +refs/tags/*:refs/tags/* 最後就變成 [re ...
- mysql主从跳过错误
mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续 跳过错误有两种方式: 1.跳过指定数量的事务 mysql>stop slave; m ...
- Serverless Kubernetes全面升级2.0架构:支持多命名空间、RBAC、CRD、PV/PVC等功能
Serverless Kubernetes概述: 阿里云Serverless Kubernetes容器服务最新开放香港.新加坡.悉尼区域,同时全面开放2.0架构,帮助用户更加便捷.轻松地步入“以应用为 ...
- 0809NOIP模拟测试赛后总结
终于有点脸单独建一个随笔写一下考试总结了…… T1一眼组合数学,推了一会儿式子发现恐怕是容斥.突然害怕,于是开始大力dp. 然后骗了70分走人hhh. T2挂了……又读错题了……以为必须相邻,然后就原 ...
- (转)剖析Linux文件编码的查看及修改
Linux文件编码的查看和修改都有不止一种做法,如果你需要在Linux中操作windows下的文件,那么很可能会经常遇到文件编码转换的问题,如何进行这项工作,也应该是经常工作在双系统下的操作者的必须掌 ...