洛谷P1278 单词游戏
来源:互联网 发布:新网域名过户到阿里云 编辑:程序博客网 时间:2024/05/21 07:57
Description
Io和Ao在玩一个单词游戏。他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须 与前一个单词的最后一个字母一致。游戏可以从任何一个单词开始。 任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。 游戏的复杂度定义为游戏中所使用的单词的长度总和。 编写程序求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
数据规模限制:单词总数不超过16,单词长度不超过100。
Input
第一行给数字N,代表有多少个单词
下面N行,每行一个单词
Output
最大可能复杂度
Sample Input
3
AE
A
IA
Sample Output
5
HINT
题解
这道题…状态压缩DP裸题啊…
跟之前写过的一道题很像(codevs 2596 售货员的难题,题解传送门)
代码
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;struct word{ char first,last; int length;};word a[100];int f[17][70000];int n,i,j,k,ans;char s[109];int main(){ scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%s",s+1); a[i].length=strlen(s+1); a[i].first=s[1]; a[i].last=s[a[i].length]; } for (i=0;i<=(1<<n)-1;i++) { for (j=1;j<=n;j++) { if ((i&(1<<(j-1)))!=0) { for (k=1;k<=n;k++) { if (j!=k) { if (i&(1<<(k-1))) { if (a[k].last==a[j].first) { f[j][i]=max(f[j][i],f[k][i-(1<<(j-1))]+a[k].length);//注意一下状态转移方程 if (f[j][i]>ans) { ans=f[j][i];//这里其实不需要的,直接将ans赋值成inf就好了 } } } } } } } } for (i=1;i<=n;i++) { ans=max(ans,f[i][(1<<n)-1]+a[i].length); } printf("%d\n",ans); return 0;}
阅读全文
0 0
- 洛谷 P1278 单词游戏
- 洛谷P1278 单词游戏
- 洛谷 P1278 单词游戏 【状压dp】
- P1278 单词游戏
- 单词游戏
- 单词游戏
- 【单词游戏】解题报告
- 7.9 单词游戏 搜索
- 单词搜索迷宫游戏
- Boggle单词游戏求解
- 猜单词游戏
- 单词玩游戏
- 模拟猜单词游戏
- 【c++】猜单词游戏
- 猜单词的游戏
- 猜单词游戏
- 单词游戏: hangman
- [各种面试题] 单词游戏
- 正则表达式
- Redis--持久化
- 总结
- 【模板】迪杰斯特拉的优先队列优化
- 第一篇博客
- 洛谷P1278 单词游戏
- Spring-Data-Redis集群配置和RedisTemplate用法
- cff学生排队201703-2
- mysql字段加密
- [iOS]数量加减按钮效果
- 以链表和数组实现并归排序的区别
- 剑指offer--面试题22:链表中倒数第k个节点
- 刘汝佳《算法竞赛入门经典(第二版)》习题(七)
- 赛码网刷题之军训队列