Io和Ao在玩一个单词游戏。
他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。
游戏可以从任何一个单词开始。
任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。
游戏的复杂度定义为游戏中所使用的单词长度总和。
编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。
输出文件仅有一行,表示该游戏的最大可能复杂度。
5
IOO
IUUO
AI
OIOOI
AOOI
16
“状压DP 又叫集合动态规划。是以结合信息为状态的特殊的动态规划的问题。主要有传统集合动态规划和基于连通性状态压缩的动态规划两种。” ————百度
是不是感觉很高大尚?(我也觉得 )
他非常简(妙 )单(啊 )
#include<bits/stdc++.h>using namespace std;
int n,dp[30][1<<16];
string a[20];
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)dp[a[i][int(a[i].size()-1)]-'A'][1<<(i-1)]=int(a[i].size());//初始化 for(int i=1;i<=1<<n;i++){for(int j=1;j<=n;j++){//考虑用j进行转移 if(!(i&1<<(j-1))) continue;//如果这个状态不包括这个点,就跳过 for(int k=1;k<=n;k++){ if(i&1<<(k-1)) continue;//如果状态选了k这个点,那么就不必要再选了 if(a[j][int(a[j].size())-1]-'A'!=a[k][0]-'A') continue;//如果接不上,也跳过 dp[a[k][int(a[k].size())-1]-'A'][i|(1<<(k-1))]=max(dp[a[j][int(a[j].size())-1]-'A'][i]+int(a[k].size()),dp[a[k][int(a[k].size())-1]-'A'][i|(1<<(k-1))]); }}}int maxx=0;for(int i=1;i<=1<<n;i++){for(int j=1;j<=n;j++){maxx=max(maxx,dp[a[j][int(a[j].size())-1]-'A'][i]);}}cout<<maxx;//由于不一定全选,所以枚举每个状态,输出即可 return 0;
}
推荐另外一道很相像的题:
吃奶酪
本文发布于:2024-01-29 05:48:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170647852513138.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |