题目链接:成语接龙
题目要求输出最长的龙的长度,主要的问题是如何计算重叠区域的长度!
我们可以假设重叠部分的长度为 1 (再依次增加) ,但是因为最后输入的是一个字符,没有 s[1],我们可以在前面给他加上一个字符(任意都可以,,最好还是加个空格吧,万一点背,加上的字符正好可以被判断,那就得不偿失了。。)我们在找重叠部分面积时,不必找到最大的重叠面积,找最小的就行 hellolo 和 loloabc 我们当然希望是 hellololoabc ( 不是 helloloabc !)
回溯时,注意将 use --
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
string s[25];
int use[25];
int len,n;
int unionn(string s1,string s2)
{
int lens1 = s1.length();
int lens2 = s2.length();
for(int i=1;i<min(lens1,lens2);i++)
{
int flag = 1;
for(int j=0;j<i;j++)
{
if(s1[lens1-i+ j] != s2[j])
{
flag = 0;
}
}
if(flag)
return i;
}
return 0;
}
int dfs(string now,int lenn)
{
len = max(len,lenn);//更新龙的长度
for(int i=0;i<n;i++)
{
if(use[i] >= 2) //判断能用吗
continue;
int c = unionn(now,s[i]);
if(c>0)
{
use[i] ++;
dfs(s[i],lenn + s[i].length() - c); //
use[i] --;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<=n;i++)
{
cin>>s[i];
use[i] = 0;
}
dfs(' ' + s[n],1);
cout<<len;
return 0;
}