codeforces 191A
题意:
给
定
n
个
长
度
不
超
过
10
的
字
符
串
,
收
尾
字
母
相
同
的
字
符
串
可
以
拼
接
在
一
起
。
给定n个长度不超过10的字符串,收尾字母相同的字符串可以拼接在一起。
给定n个长度不超过10的字符串,收尾字母相同的字符串可以拼接在一起。
问
最
大
环
的
长
度
。
问最大环的长度。
问最大环的长度。
题解:
d
p
[
i
]
[
j
]
表
示
以
字
母
i
为
首
,
字
母
j
为
尾
所
能
组
成
的
字
符
串
的
最
大
长
度
。
dp[i][j]表示以字母i为首,字母j为尾所能组成的字符串的最大长度。
dp[i][j]表示以字母i为首,字母j为尾所能组成的字符串的最大长度。
先
拼
接
后
成
环
,
遍
历
d
p
[
i
[
[
i
]
。
先拼接后成环,遍历dp[i[[i]。
先拼接后成环,遍历dp[i[[i]。
- 若 前 一 个 状 态 合 法 ( 序 列 不 为 空 ) , d p [ i ] [ r ] = m a x ( d p [ i ] [ r ] , d p [ i ] [ l ] + l e n ) 若前一个状态合法(序列不为空),dp[i][r] = max(dp[i][r], dp[i][l]+len) 若前一个状态合法(序列不为空),dp[i][r]=max(dp[i][r],dp[i][l]+len)
- 特 判 , d p [ l ] [ r ] = m a x ( d p [ l ] [ r ] , l e n ) 特判,dp[l][r] = max(dp[l][r], len) 特判,dp[l][r]=max(dp[l][r],len)
#include <bits\stdc++.h>
using namespace std;
int dp[26][26];
int main() {
int n;
for(cin >> n ; n > 0 ; n--){
string s;
cin >> s;
int len = s.size();
int l = s[0]-'a';
int r = s[len-1]-'a';
for(int i = 0 ; i < 26 ; i++){
if(dp[i][l]){
dp[i][r] = max(dp[i][r], dp[i][l]+len);
}
}
dp[l][r] = max(dp[l][r], len);
}
int ans = 0;
for(int i = 0 ; i < 26 ; i++){
ans = max(ans, dp[i][i]);
}
cout << ans << endl;
return 0;
}