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;//好习惯
}
posted @ 2024-12-23 17:04  califeee  阅读(52)  评论(0)    收藏  举报