题意:一共给你N个字符串,如果一个字符串的尾部字母和一个字符串的首部字母相同,/那么两个字符串就可以拼接起来,问最长的首尾字母相同的字符串的长度为多少。
//思路:DP便利一遍就够了 ,dp[a][b]表示以a为首字母b为尾字母最长序列
// 题意:一共给你N个字符串,如果一个字符串的尾部字母和一个字符串的首部字母相同, //那么两个字符串就可以拼接起来,问最长的首尾字母相同的字符串的长度为多少。 //思路:DP便利一遍就够了 #include<bits/stdc++.h> using namespace std; #define int long long int dp[1000][1000];//表示首字母为i,尾字母为j的最长长度 string s[5000005]; signed main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>s[i]; } memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ int m=s[i].length(); int a=s[i][0]-'a',b=s[i][m-1]-'a'; if(a!=b){ for(int j=0;j<=30;j++){ if(dp[j][a]!=0&&j!=a) { dp[j][b]=max(m+dp[j][a],dp[j][b]);//必须加max!!!! } } dp[a][b]=max(dp[a][a]+m,dp[a][b]);//dp[a][b]需要单独提出来,因为可能之前有dp[a][b]的值,可能覆盖掉 } if(a==b){ for(int j=0;j<=30;j++){ if(dp[j][a]!=0||j==a){ dp[j][a]+=m;//a==b就直接加 } } } } int k=0; for(int i=0;i<=30;i++){ k=max(k,dp[i][i]); } cout<<k<<endl; return 0; }