Dynasty Puzzles(dp)
A. Dynasty Puzzles
题目来源https://codeforces.com/problemset/problem/191/A
题目描述
题目太长大意是:给你n个字符串,将这些字符串拼接,求一个最长的序列,使这个其中每个串的最后一个字母与第一个字母相同(最后一个串的最后一个字母与第一个串的第一个字母相同),而且后面的串只能接在前面的串的后边。
举个例子:\(auj\qquad jhg\qquad gfert\qquad tyugj\qquad jbgva\)
思路
考虑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;//好习惯
}

浙公网安备 33010602011771号