2024-12-23 17:04阅读: 9评论: 0推荐: 0

Dynasty Puzzles(dp)

A. Dynasty Puzzles

题目来源https://codeforces.com/problemset/problem/191/A

题目描述

题目太长大意是:给你n个字符串,将这些字符串拼接,求一个最长的序列,使这个其中每个串的最后一个字母与第一个字母相同(最后一个串的最后一个字母与第一个串的第一个字母相同),而且后面的串只能接在前面的串的后边。
举个例子:aujjhggferttyugjjbgva

思路

考虑dp

f(i,j):表示从字符i到字符j能走过的最大长度
则对于字符串s来说,有
f(s(0),s(len-1)) = len

状态转移方程为:f(i,r) = max(f(i,r), f(i,l) + len)

代码

#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<cstring>
using namespace std;
inline int read(){//这个题没什么用的快读
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
char c[10];
int f[27][27];
int main(){
int n=read(),ans=0;
for(int i=1;i<=n;++i){
scanf("%s",c);//开一个数组就够了,为保证后面的串接在前面,边读边做
int len=strlen(c),l=c[0]-'a',r=c[len-1]-'a';//如上所述
for(int j=0;j<26;++j)
if(f[j][l])f[j][r]=max(f[j][r],f[j][l]+len);
f[l][r]=max(f[l][r],len);
}
for(int i=0;i<26;++i)ans=max(f[i][i],ans);//统计答案
printf("%d\n",ans);//输出
return 0;//好习惯
}

本文作者:califeee

本文链接:https://www.cnblogs.com/califeee/p/18624530

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   califeee  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.