P1278 单词游戏【洛谷算法习题】

P1278 单词游戏

网页链接

P1278 单词游戏

题目描述

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

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

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

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

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

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

5 IOO IUUO AI OIOOI AOOI

输出 #1

16

解题思路

本题是状压 DP + 记忆化搜索的经典问题。给定N NN个仅由元音字母组成的单词(N ≤ 16 N \le 16N≤16),要求将它们排列成一个序列,使得后一个单词的首字母等于前一个单词的尾字母,每个单词最多使用一次,求所有单词长度之和的最大值。

1. 问题等价转化
  • 将每个单词视为一个节点,若单词A AA的尾字母等于单词B BB的首字母,则存在一条从A AA到B BB的有向边。游戏的目标是在这个有向图中找到一条不重复经过节点的路径,使得路径上所有单词的长度之和最大。
  • 由于N ≤ 16 N \le 16N≤16,可以使用二进制状态压缩表示已经使用过的单词集合。状态总数为2 16 × 16 ≈ 10 6 2^{16} \times 16 \approx 10^6216×16≈106,完全可行。
  • 定义dfs(x, mask)表示当前以第x xx个单词结尾,已使用的单词集合为mask时,能继续获得的最大长度总和。
2. 状态设计
  • x:当前最后一个单词的编号(1 到N NN)。
  • mask:二进制掩码,第i ii位为 1 表示第i ii个单词已经被使用。
  • 记忆化数组f[x][mask]存储该状态的最大后续长度。
3. 状态转移
  • 对于当前单词x,取其尾字母last = s[x].back()。
  • 遍历所有以该尾字母开头的单词(通过预处理的邻接表v[last]快速找到)。
  • 对于每个候选单词i:
    • 若i尚未在mask中使用(即mask的第i位为 0),则可以接在x之后。
    • 递归调用dfs(i, mask | (1 << (i-1))),获得从i继续的最大长度。
    • 取所有候选中的最大值。
  • 最终返回当前单词长度 + 后续最大值。
  • 若没有可接的单词,后续最大值为 0。
4. 初始调用
  • 由于游戏可以从任意单词开始,需要枚举每个单词作为起点,调用dfs(i, 1 << (i-1)),取所有起点的最大值作为答案。
5. 复杂度分析
  • 状态数:N × 2 N ≤ 16 × 65536 ≈ 10 6 N \times 2^N \le 16 \times 65536 \approx 10^6N×2N≤16×65536≈106。
  • 转移:每个状态最多枚举N NN个候选单词,总运算量约N 2 × 2 N ≈ 1.6 × 10 7 N^2 \times 2^N \approx 1.6 \times 10^7N2×2N≈1.6×107,在 1 秒内可以完成。
  • 空间复杂度:记忆化数组f[17][1<<17]约1.1 × 10 6 1.1 \times 10^61.1×106个long long,空间约 9MB,满足 256M 限制。

总结

利用状态压缩表示单词的使用情况,结合记忆化搜索枚举所有可能的单词序列,避免重复计算。通过预处理每个尾字母对应的候选单词列表,加速状态转移。最终从所有可能的起点出发取最大值即为答案。该方法简洁高效,是解决小规模排列优化问题的标准思路。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;string s[18];vector<ll>v[210];ll f[17][1<<17];lldfs(ll x,ll y){if(f[x][y])returnf[x][y];ll r=0;for(autoi:v[s[x][s[x].size()-1]]){if(!((y>>(i-1))&1))r=max(r,dfs(i,y|(1<<(i-1))));}returnf[x][y]=r+s[x].size();}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n;cin>>n;for(ll i=1;i<=n;i++){cin>>s[i];v[s[i][0]].push_back(i);}ll ans=0;for(ll i=1;i<=n;i++)ans=max(ans,dfs(i,(1<<(i-1))));cout<<ans;return0;}

相关新闻

中学技校网站ASP整站源码:IIS部署与二次开发实战指南

中学技校网站ASP整站源码:IIS部署与二次开发实战指南

简介&#xff1a;这是一套面向中学、技校及职业院校的整站ASP网站源码&#xff0c;适合需要快速搭建校园门户的开发者、教师或学生参考使用。资源包共167个文件&#xff0c;以101个asp动态页面为核心&#xff0c;配合26个gif与14个jpg图片素材、7个swf动画、5个htm与4个html静态…

2026/10/21 2:31:56 阅读更多 →
STM32F407驱动AD9854:电赛扫频与寄存器配置高频考点解析

STM32F407驱动AD9854:电赛扫频与寄存器配置高频考点解析

简介&#xff1a;本资源面向参加电子设计竞赛或学习STM32嵌入式开发的学生与工程师&#xff0c;提供基于STM32F407与HAL库驱动AD9854 DDS模块输出正弦波并实现扫频功能的完整工程。信号源在扫频仪、阻抗分析仪中应用广泛&#xff0c;相比单片机DAC或FPGA ROM方案&#xff0c;AD…

2026/10/21 2:31:56 阅读更多 →
亚马逊新手开广告总踩坑?实时查竞价,帮你告别盲目出价

亚马逊新手开广告总踩坑?实时查竞价,帮你告别盲目出价

很多亚马逊新手上架新品之后&#xff0c;最焦虑的就是广告。选品的时候只算了拿货、头程、平台佣金&#xff0c;完全没预估广告点击成本&#xff1b;等到上架开广告&#xff0c;出价全靠猜。出价给高了&#xff0c;预算半天烧光&#xff0c;ACoS一路飙升&#xff0c;订单赚的钱…

2026/10/21 2:30:55 阅读更多 →

最新新闻

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

我做无人机视觉落地也有几年了&#xff0c;今年被问得最多的问题不是“模型怎么调”&#xff0c;而是“模型怎么到了现场就不灵”。很多朋友拿着公开的航拍检测模型&#xff0c;在桌面演示上mAP能到七八十个点&#xff0c;可一部署到国内的十字路口、老小区、城乡结合部&#x…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

简介&#xff1a;Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具&#xff0c;主要运行于Windows平台&#xff0c;面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员&#xff0c;用于快速定位PHP项目中的安全隐患。它能够识别SQL注入、代码执行、命令执行、文件包含…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

简介&#xff1a;Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具&#xff0c;主要运行于Windows平台&#xff0c;面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员&#xff0c;用于快速定位PHP项目中的安全隐患。它可检测SQL注入、代码执行、命令执行、文件包含、…

2026/10/21 3:07:07 阅读更多 →
程序员 AI 出图避坑:椒图 AI 与 Nano Banana Pro 实战指南

程序员 AI 出图避坑:椒图 AI 与 Nano Banana Pro 实战指南

如果你也是那种被拉去“顺带做个图”就浑身难受的程序员&#xff0c;这篇文章应该能帮你省下不少救心丸。我自己的本职是写后端&#xff0c;大部分时间对着终端和接口文档&#xff0c;但只要涉及方案评审、产品汇报、开源项目宣传&#xff0c;就逃不开一个尴尬任务&#xff1a;…

2026/10/21 3:07:07 阅读更多 →
从能生成到有质感:Seedance 2.0镜头语言全解析

从能生成到有质感:Seedance 2.0镜头语言全解析

先说一个我自己的真实感受&#xff1a;第一次用 Seedance 2.0 生成视频时&#xff0c;我很兴奋&#xff0c;因为画面真的“能动了”。但等我把五六段素材拼到一起&#xff0c;越看越不对劲——画面在动&#xff0c;情绪却没动&#xff1b;每个镜头单拎出来都不差&#xff0c;连…

2026/10/21 3:07:07 阅读更多 →
RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

先说明一点&#xff1a;这个标题我深有同感。做了大半年RAG相关的东西&#xff0c;见过不少团队把精力全压在召回链路调参上&#xff0c;结果效果上不去&#xff0c;最后排查一圈&#xff0c;问题全出在知识库本身——脏数据、错分块、无版本、无评测&#xff0c;源头一乱&…

2026/10/21 3:06:07 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →