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

本文介绍了一个使用动态规划解决的问题,旨在寻找一系列连续朝代名称的最大总长度,其中每个朝代名称首尾字母相连形成序列。通过构建二维DP数组记录不同起始和结束字母的朝代名长度,并最终找出最长的单一朝代序列。
摘要由CSDN通过智能技术生成

题意不说了,看原题吧,思路见代码:

 

#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;
}

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/3285544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值