题目大意:
给定n个字符串,从中依次选若干个,头尾相接的两个字符串必须第一个字符串的最后一个字符和第二个字符串的第一个字符相同,求能够组成的最大字符串的长度,目标字符串首尾字符必须相同。
解题思路:
dp[i][j]为以i为首以j为尾的最大字符串长度,则如果当前字符串为abcde,遍历dp[i][‘a’],如果这个不为0,则转移dp[i][‘e’]=max(dp[i][‘e’],dp[i][‘a’]+len)
#include
#define ll long long
using namespace std;
const int maxn=2e5+10;
char arr[maxn][15];
ll ans,dp[30][30];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
scanf("%s",arr[i]);
for(int i=0;i<n;++i)
{
ll len=strlen(arr[i]);
for(int j=0;j<26;++j)
{
if(dp[j][arr[i][0]-'a']!=0)dp[j][arr[i][len-1]-'a']=max(dp[j][arr[i][len-1]-'a'],dp[j][arr[i][0]-'a']+len);
}
dp[arr[i][0]-'a'][arr[i][len-1]-'a']=max(len,dp[arr[i][0]-'a'][arr[i][len-1]-'a']);
}
for(int i=0;i<26;++i) ans=max(ans,dp[i][i]);
cout<<ans<<endl;
return 0;
}