牛客月赛47 搭桥

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

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

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

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

按照解说的原始dp思路是外层循环看当前字符串是否能拼接到遍历到的字符串(按顺序),但是我用字符存储每个字符串的头尾会答案错误,用整数存储则是超时,不明白为什么会答案错误,有大佬知道吗?

#include <bits/stdc++.h>
using namespace std;
int ans;
int l[200010], r[200010], len[200010];
int main() {
    int t, n;
    cin >> t;
    char s[200010];
    while(t--) {
        cin >> n;
        ans = 0;
        int dp[200010];
        memset(dp, 0, sizeof(dp));
        for(int i=1;i<=n;i++) {
            scanf("%s",s);
            len[i] = strlen(s);
            l[i] = (s[0]-'a');
            r[i] = (s[len[i]-1]-'a');
            dp[i] = len[i];
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i-1;j++) {
                if(l[i]==r[j]) {
                    dp[i] = max(dp[i], dp[j]+len[i]);
                }
            }
        }
        for(int i=1;i<=n;i++) {
            ans = max(ans,dp[i]);
        }
        cout << ans << endl;
    }
    return 0;
}

这是超时的代码,把l,r数组开成字符数组就出错了。

不超时的思路是,维护mx数组,保证每个字母的连续子符个数是最优解:

#include <bits/stdc++.h>
using namespace std;
int ans;
int main() {
    int t, n;
    cin >> t;
    char s[200010];
    while(t--) {
        cin >> n;
        ans = 0;
        int mx[30];
        memset(mx, 0, sizeof(mx));
        for(int i=1;i<=n;i++) {
            scanf("%s",s);
            int len = strlen(s);
            mx[s[len-1]-'a'] = max(mx[s[len-1]-'a'], mx[s[0]-'a']+len);
            ans = max(ans, mx[s[len-1]-'a']);
        }
         
        cout << ans << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值