P1278 单词游戏 简单搜索+玄学优化

单词游戏

传送门

题目描述

Io 和 Ao 在玩一个单词游戏。

他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。

游戏可以从任何一个单词开始。

任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。

游戏的复杂度定义为游戏中所使用的单词长度总和。

编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。

输入格式

输入文件的第一行,表示一个自然数 N ( 1 ≤ N ≤ 16 ) N(1 \le N \le 16) N(1≤N≤16), N N N 表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母 AEIOU 组成的一个字符串,每个单词的长度将小于等于 100 100 100,所有的单词是不一样的。

输出格式

输出文件仅有一行,表示该游戏的最大可能复杂度。

样例 #1

样例输入 #1

5
IOO
IUUO
AI
OIOOI
AOOI

样例输出 #1

16

注明

以上来自洛谷。 以上来自洛谷。 以上来自洛谷。

解题思路

直接找题意做即可。循环遍历每一个字符串,将其设为第一个字符串,然后暴搜就行了。注意当搜索次数达到 5 × 1 0 7 5\times 10^7 5×107 时,直接输出答案并结束程序。说起来有点抽象,结合代码容易理解。

AC Code

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s[20];
int _s[20];
bool vis[20];
int COUNT;
int Answer;
inline void dfs(int len, char c) {
	++COUNT;
	if (COUNT >= 5e7)cout << Answer, exit(0);
	Answer = max(Answer, len);
	for (register int i = 1; i <= n; ++i) {
		if (vis[i])continue;
		if (s[i][0] == c) {
			vis[i] = 1;
			dfs(len + _s[i], s[i][_s[i] - 1]);
			vis[i] = 0;
		}
	}
}
signed main() {
	cin >> n;
	for (register int i = 1; i <= n; ++i)cin >> s[i], _s[i] = s[i].size();
	for (register int i = 1; i <= n; ++i) {
		vis[i] = 1;
		dfs(_s[i], s[i][_s[i] - 1]);
		vis[i] = 0;
	}
	cout << Answer << endl;
	return 0;
}

闲话

一开始以为这题非常简单,没想到这么简单。注意到洛谷难度评级为:

#@!&( #@&(@!$(!@&#()&*%%#&Y&&%%%#%@!&(<-开启词汇联想)

大佬 C Wx 用状压 DP 通过本题,牛炸了。

相关推荐
闻缺陷则喜何志丹11 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie11451419123 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
小林熬夜学编程34 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导2 小时前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Ronin3053 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻3 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++