牛客 D-造桥 (动态规划)

题目描述

今天是愉快的周末,牛可乐和牛妹在一起玩游戏。牛妹给了牛可乐 n 个造桥的零件,每个零件以字符串的形式给出,每个字符串两端的字符是零件的接口,两个零件可以通过连接不同端的接口(一个零件的左端只能连接另一个零件的右端,右端则只能连接左端)得到一个更长的零件,新零件的长度是原零件的长度之和。

牛妹规定,零件不能翻转,且零件左边的接口只能由该零件左边的零件去连接(这意味着,应该按顺序选取零件),右端同理。

牛可乐想得到牛妹的赞许,因此他要想用牛妹给的零件拼接一个尽可能长的桥梁,你能帮帮他吗?

输入描述:

第一行一个整数 T ,代表案例数。

对于每一个案例:第一行一个数 n ,表示字符串的个数。

接下来有 n 行,每行一个字符串,每个字符串的长度 >=2。

0 <= T <= 100

所有案例的字符串长度的和不超过 2e5。

保证所有字符均为小写字符。

输出描述:

n 个字符串能拼接的最大字符串长度。

示例1

输入

1
6
ab
baabc
bb
ba
ba
ad

输出

8

说明

按顺序依次拼接:1,3,5,6号字符串。

代码如下:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, t;
const int N = 2e5 + 10;
char s[N];
int dp[30]; // dp[i]代表当前以字符i为结尾的能连成的最长的长度

int main() {
    cin >> t;
    while(t --) {
        memset(dp, 0, sizeof dp);
        cin >> n;
        int ans = 0;
        for(int i = 1; i <= n; i ++) {
            cin >> s;
            int len = strlen(s);
            int x = s[len - 1] - 'a';
            int y = s[0] - 'a';
            dp[x] = max(dp[x], dp[y] + len); 
// dp[x]是以末尾字符结尾的当前最长的长度, dp[y] + len是以开头字符为结尾的当前最长的长度 + 
// 这个字符串的长度
            ans = max(ans, dp[x]);
        }
        cout << ans << "\n";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值