暑假集训单切赛第一场 CF 191A Dynasty Puzzles
题意不说了,看原题吧,思路见代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n; char str[15]; int len; char a,b; //a为名字的开头字符,b为名字的结尾字符 long long dp[26][26]; //dp[i][j]记录以字母i开头和字母j结尾的朝代名长度 ,最后只要遍历一遍dp[i][i],取最大长度的即可 int main() { int tmp; memset(dp,0,sizeof(dp)); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",str); len=strlen(str); a=str[0]; b=str[len-1]; int flag=0; //如果以a结尾且不等于0的朝代名长度加上他的名字,比现有的朝代名更长,则更新。 for(int j=0;j<=25;j++){ tmp=a-'a'; if(dp[j][tmp]!=0 && dp[j][tmp]+len>dp[j][b-'a']){ flag=1; dp[j][b-'a']=dp[j][tmp]+len; } } //如果他名字足够长,也可以直接当一个朝代的首位皇帝 if(dp[a-'a'][b-'a']<len) dp[a-'a'][b-'a']=len; } long long ans=0; //遍历对角线上的,取最大值 for(int j=0;j<=25;j++){ if(dp[j][j]>ans) ans=dp[j][j]; } printf("%I64d\n",ans); return 0; }