您的位置:首页 > 其它

暑假集训单切赛第一场 CF 191A Dynasty Puzzles

2013-08-27 18:07 148 查看
题意不说了,看原题吧,思路见代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: