洛谷P1278 单词游戏
题目描述
Io和Ao在玩一个单词游戏。
他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。
游戏可以从任何一个单词开始。
任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。
游戏的复杂度定义为游戏中所使用的单词长度总和。
编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
输入输出格式
输入格式:
输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。
输出格式:
输出文件仅有一行,表示该游戏的最大可能复杂度。
输入输出样例
输入样例#1:
5 IOO IUUO AI OIOOI AOOI
输出样例#1:
70分 爆搜
100分 状压dp
16
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,ans; struct node{ int a,b,l; }q[20]; bool vis[20]; void dfs(int sum,int la){ ans=max(ans,sum); for(int i=1;i<=n;i++){ if(vis[i]||(q[i].a!=q[la].b&&la))continue; vis[i]=1; dfs(sum+q[i].l,i); vis[i]=0; } } int main(){ //freopen("Cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ char ch[120]; scanf("%s",ch+1); int len=strlen(ch+1); q[i].a=ch[1]; q[i].b=ch[len]; q[i].l=len; } dfs(0,0); printf("%d",ans); }
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int n,m,ans,dis[16],f[1<<16][16]; char s[1<<16][110]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s[i]); dis[i]=strlen(s[i])-1; } for(int i=1;i<=n;i++) f[(1<<(i-1))][i]=dis[i]+1; for(int i=0;i<=(1<<n)-1;i++) for(int j=1;j<=n;j++) { int e1=1<<(j-1); if((i|e1)==i) for(int k=1;k<=n;++k) { if((j==k)||(s[j][dis[j]]!=s[k][0])) continue; int e2=1<<(k-1); if((i&e2)==0) { f[(i|e2)][k]=max(f[(i|e2)][k],f[i][j]+dis[k]+1); ans=max(ans,f[(i|e2)][k]); } } } cout<<ans; }