**1864 - 单词接龙的最长长度 ---深搜dfs剪枝
** 来源:东方博宜oj oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
/*
1,如果两个单词能接龙,我们要尽可能短的匹配,使得龙更长
2,为了避免重复的判断两个单词能否接龙,我们可以预处理一下单词之间的匹配状态
计算出任意两个单词之间最短可以匹配多少个字符,提升搜索的速度
*/
int n;
string a[30];
int d[30][30];
int f[30];
char c;
int ma;
void dfs(int idx,int len)
{
ma=max(ma,len);
f[idx]++;
for(int i=1;i<=n;i++)
{
if(f[i]<2&&d[idx][i]!=0) dfs(i,len+a[i].size()-d[idx][i]);
}
f[idx]--;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>c;
for(int i=1;i<=n;i++) // n个单词
{
for(int j=1;j<=n;j++)
{
int l1=a[i].size(),l2=a[j].size();
//枚举可能匹配的长度
for(int k=1;k<min(l1,l2);k++)
{
// 如果第i个单词的尾有k个字符和第j个单词的头相同,说明能匹配
if(a[i].substr(l1-k)==a[j].substr(0,k))
{
d[i][j]=k;
break;
}
}
}
}
for(int i=1;i<=n;i++)
{
if(a[i][0]==c) dfs(i,a[i].size());
}
cout<<ma;
return 0;
}
1864 - 单词接龙的最长长度 ---深搜dfs剪枝
最新推荐文章于 2024-04-03 21:52:34 发布