解法1 玄学剪枝
最暴力的dfs是很好打的 交上去有70
考虑如何剪枝
1.当一个单词首尾和另外一个单词相同时,优先选择最长的那个,其他的不用选。
这一点很好实现,给原数组排个序,dfs的时候写个while特判一下就好
2.卡时自杀式剪枝
你懂我意思吧
以上两个剪枝随便加一个都可以过。。。
解法2 状压dp
n<=16 应该要先存下所有单词选与不选的情况
考虑到只和一个单词的开头结尾有关 那么设f[i][j]表示状态为i 结尾字母为j的最大值
然后枚举所有状态 对于每个状态 选其中的一个字符串作为最后选进来的 更新当前f
解法1代码
#include<bits/stdc++.h>
using namespace std;
int n,ans,tim;
string s;
struct W
{
int len;
char begin,end;
bool vis;
}word[20];
void dfs(int now,int len,int cnt)
{
ans=max(ans,len);
if(clock()-tim>10000) //自杀式剪枝
{
cout<<ans;
exit(0);
}
for(int i=1;i<=n;i++)
{