下面我们直接从题目入手:
(该题出自牛客小白月赛47 )
分析:该题可以用动态规划的思想来解,我们可以构造一个int类型数组dp[26]。因为只有26个字母所以只要开26就已经足够了。然后把每个字符串的首字母和最后一个字母映射成一个数字,实现代码为:
int a=s[0]-'a';
int b=s[s.size()-1]-'a';
//s为输入的字符串
dp[i]所报存的值为以字符i结尾的最长的长度。
最后遍历dp数组找出最大的值即可。
下面是完整代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[30];
int T;
int n;
int main()
{
cin>>T;
while(T--)
{
cin>>n;
memset(dp,0,sizeof dp);
for(int i = 0; i < n ; i++ )
{
string s;
cin>>s;
int a=s[0]-'a';
int b=s[s.size()-1]-'a';
int k=s.size();
dp[b]=max(dp[b],dp[a]+k);
}
int ans=0;
for(int i=0; i < 26; i++)
{
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}