接词游戏问题
Description
Io和Ao正在进行玩词游戏,游戏的规则为:他们俩交换讲仅由元音组成的单词,要求跟讲的单词的第一个字母同前面说的单词的最后一个字母相同。游戏开始可以从任何词进行。
游戏规定不允许讲同一个词两次,游戏仅能使用在给出的词典中的单词。
游戏的复杂性在于需要统计游戏过程中所有说过的单词的长度。
请你编写一个程序确定在玩游戏过程中可以从给出的词典中使用单词最大的可能复杂程度。
Input
文件的第一行是测试用例的个数M(1 ≤ M≤ 1000),每个测试用例的第一行是一个自然数N(1 ≤ N ≤ 1000),N代表词典中可以使用单词的个数。接下来的N行为该词典中的单词,每个单词由‘A’, ‘E’, ‘I’, ‘O’ and ‘U’的一个排列组成。并已知单词的长度不超过10000,所有单词都是不同的。
Output
将你计算的该游戏的最大可能的复杂程度使用一行输出来。
Sample Input
3
3
AEIOU
UIU
EO
4
AEEEO
OEOAEEE
AO
O
5
IOO
IUUO
AI
OIOOI
AOOI
3
AEIOU
UIU
EO
4
AEEEO
OEOAEEE
AO
O
5
IOO
IUUO
AI
OIOOI
AOOI
Sample Output
8
13
16
13
16
思路:
直接暴力,枚举就可以了。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char map[1005][10005]; int vis[1005]; long long list_max; int index; void meiju(int num,int p) { if(list_max<num) list_max = num; if(p==-1) { for(int j=0; j<index; j++) { if(vis[j]==0) { vis[j]=1; meiju(num+strlen(map[j]),j); vis[j]=0; } } } else { for(int j=0; j<index; j++) { if(vis[j]==0 && map[p][strlen(map[p])-1] == map[j][0]) { vis[j]=1; meiju(num+strlen(map[j]),j); vis[j]=0; } } } return ; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&index); getchar(); memset(vis,0,sizeof(vis)); for(int i=0; i<index; i++) gets(map[i]); list_max =0; meiju(0,-1); printf("%lld\n",list_max); } return 0; }
运行时间如下:
注:后台运行的时间不同,结果就不太一样!