P1278

单词游戏

题目描述

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

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

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

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

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

5
IOO
IUUO
AI
OIOOI
AOOI

样例输出 #1

16
正常爆搜70pts

信仰剪枝:

cnt++;
if(cnt>1e7){cout<<maxx<<"\n";exit(0);}

然后就过了???

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
struct did{
	string s;
	int l;
}a[17];
int vis[17],maxx=-1,cnt=0;
int pd[17][200],tot;
bool cmp(did x,did y)
{
	return x.s<y.s;
}
void dfs(int step,int len,char end)
{
	maxx=max(maxx,len);
	if(step==n+1)
	{
		maxx=max(maxx,len);
		return ;
	}
	cnt++;
	if(cnt>1e7)
	{
		cout<<maxx<<"\n";
		exit(0);
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			string t=a[i].s;
			if(t[0]==end||end=='%')
			{
				vis[i]=1;
				int l=a[i].l;
				dfs(step+1,len+l,t[l-1]);
				vis[i]=0;
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].s;
		a[i].l=a[i].s.size();
		tot+=a[i].l;
	}
	sort(a+1,a+n+1,cmp);
	dfs(1,0,'%');
	cout<<maxx<<"\n";
	return 0;
}
posted @ 2023-01-10 19:28  PKU_IMCOMING  阅读(12)  评论(0)    收藏  举报