看到很久的一道题,敲起来略麻烦一直咕到现在。
解法很水深搜+回溯就行
每次枚举所有单词判断是否出现过两次以上,是否能接上,接上长度是多少,是否重叠就可以,当没有能接上的单词表示已搜完维护答案最大值即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[50][300];
int len[50],t[50],ans=0,n,maxn=-41324;
void dfs(int id)
{
int flg=0;
for(int i=1;i<=n;i++)
{
if(t[i]<2)
for(int j=0;j<len[id];j++)
{
if(s[i][0]==s[id][j])
{
if(j==0&&len[i]!=len[id]) continue;
int l=1;
bool pan=0;
for(int h=j+1;h<len[id];h++)
if(s[id][h]!=s[i][l++])
{
pan=1;
break;
}
if(pan==1) continue;
else
{
flg++;ans+=len[i]-l;t[i]++;
dfs(i);
flg--;ans-=len[i]-l;t[i]--;
}
}
}
}
if(flg==0)
{
maxn=max(maxn,ans);
return;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",&s[i]);
len[i]=strlen(s[i]);
}
scanf("%s",&s[n+1]);
for(int i=1;i<=n;i++)
if(s[i][0]==s[n+1][0])
{
ans=len[i];t[i]++;dfs(i);
ans=0;t[i]--;
}
printf("%d",maxn);
return 0;
}