Dynasty Puzzles(dp)
A. Dynasty Puzzles
题目来源https://codeforces.com/problemset/problem/191/A
题目描述
题目太长大意是:给你n个字符串,将这些字符串拼接,求一个最长的序列,使这个其中每个串的最后一个字母与第一个字母相同(最后一个串的最后一个字母与第一个串的第一个字母相同),而且后面的串只能接在前面的串的后边。
举个例子:
思路
考虑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 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步