P1278 单词游戏
2018-08-06 21:46
232 查看
题目描述
Io和Ao在玩一个单词游戏。他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。
游戏可以从任何一个单词开始。
任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。
游戏的复杂度定义为游戏中所使用的单词长度总和。
编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
输入输出格式
输入格式:输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。
输出格式:
输出文件仅有一行,表示该游戏的最大可能复杂度。
输入输出样例
输入样例#1:5 IOO IUUO AI OIOOI AOOI
输出样例#1:
16
Solution:
裸的状压dp,转移也比较常规,用2进制表示串是否被用,并且记录一下当前状态下所在的串以便于转移。
代码:
#include<bits/stdc++.h> #define il inline #define ll long long #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--) using namespace std; int n,len[20],w[20][20],ans; struct node{ int v,pos; }f[1<<17]; char s[20][2],t[200]; int main(){ scanf("%d",&n); For(i,1,n){ scanf("%s",t); len[i]=strlen(t),s[i][0]=t[0],s[i][1]=t[len[i]-1]; f[1<<i-1].v=len[i],f[1<<i-1].pos=i; ans=max(ans,len[i]); } For(i,1,n) For(j,1,n) if(s[i][1]==s[j][0]&&i!=j) w[i][j]=1; For(i,1,(1<<n)-1) if(f[i].v) For(j,1,n) if(w[f[i].pos][j]&&!(i&1<<(j-1))) if(len[j]+f[i].v>f[i|(1<<(j-1))].v){ f[i|(1<<(j-1))].v=len[j]+f[i].v; f[i|(1<<(j-1))].pos=j; ans=max(ans,f[i|(1<<(j-1))].v); } cout<<ans; return 0; }
相关文章推荐
- 洛谷 P1278 单词游戏
- 洛谷 P1278 单词游戏 【状压dp】
- 洛谷 P1278 单词游戏 【状压dp】
- 日文游戏常见日语单词及读音
- 猜单词的游戏
- 字谜游戏,寻找字符矩阵中行、列、对角线方向的包含的所有单词
- php猜单词游戏
- 从几个字母猜所能组成的英文单词游戏开始
- 网易之小易参与了一个记单词的小游戏。游戏开始系统提供了m个不同的单词,小易记忆一段时间之后需要在纸上写出他记住的单词。小易一共写出了n个他能记住的单词, 如果小易写出的单词是在系统提供的,将获得
- java实现单词搜索迷宫游戏
- 【单词游戏】解题报告
- [各种面试题] 单词游戏
- [SDOI2007] 单词接龙游戏 dp
- 【c++】猜单词游戏
- 7.9 单词游戏 搜索
- 吴昊品游戏核心算法 Round 17(补遗篇) —— 单词游戏(前篇)
- Yii Framework 开发教程(4) Hangman 猜单词游戏实例
- Yii Framework 开发教程(4) Hangman 猜单词游戏实例
- 游戏常用英文单词缩写
- 洛谷P1278 单词游戏