记忆化搜索。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
const int M=(1<<17);
int f[M][20],n,len[20],ans;
char s[20][109];
int dfs(int x,int S)//S这个状态,最后一个单词是x,再往后接,能够得到的最长长度
{
int sum=len[x],ML=0;
for(int i=1;i<=n;i++)
if(!(S&(1<<i-1)))
{
if(s[x][len[x]-1]==s[i][0])
{
ML=max(ML,f[S^(1<<i-1)][i]?f[S^(1<<i-1)][i]:f[S^(1<<i-1)][i]=dfs(i,S^(1<<i-1)));
}
}
return f[S][x]=sum+ML;
}
int main()
{
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
{
cin>>s[i];
len[i]=strlen(s[i]);
}
for(int i=1;i<=n;i++)
{
ans=max(ans,f[1<<i-1][i]?f[1<<i-1][i]:f[1<<i-1][i]=dfs(i,(1<<i-1)));
}
printf("%d",ans);
return 0;
}