暑假集训单切赛第一场 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;
}

 

posted @ 2013-08-27 18:07  辰曦~文若  阅读(239)  评论(0编辑  收藏  举报