2025/03/16蚂蚁笔试第二题思路和代码

思路:动态规划,保证组成的最后字符串中不包含110,那么其实只需要记录当前已经组成的字符串最后的三种状态,分别是0,1,11

对于枚举的新字符如果为0,则可以由状态0->0 / 1->0, 但是如果前面的状态为11则不能转移,因为会组成110与题目要求不符

对于枚举的新字符如果为1,则可以由状态0->1 / 1->11 / 11->11 这三种状态转移

按照上述分析进行转移即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int n;
    cin >> n;
    vector<ll> arr(n);
    for (int i = 0; i < n; i++) cin >> arr[i];
    vector<vector<ll>> f(n, vector<long long>(3, -1));
    string s;
    cin >> s;
    if (s[0] == '0') f[0][0] = arr[0];
    else if (s[0] == '1') f[0][1] = arr[0];
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < 3; j++) f[i][j] = f[i - 1][j];
        if (s[i] == '0') {
            f[i][0] = max(f[i][0], arr[i]);
            if (f[i - 1][0] != -1 || f[i - 1][1] != -1) {
                f[i][0] = max(f[i][0], max(f[i - 1][0], f[i - 1][1]) + arr[i]);
            }
        } else {
            f[i][1] = max(f[i][1], arr[i]);
            if (f[i - 1][0] != -1) {
                f[i][1] = max(f[i - 1][0] + arr[i], f[i][1]);
            }
            if (f[i - 1][1] != -1 || f[i - 1][2] != -1) {
                f[i][2] = max(max(f[i - 1][1], f[i - 1][2]) + arr[i], f[i][2]);
            }
        }
    }
    ll ans = 0;
    for (int i = 0; i < 3; i++) ans = max(f[n - 1][i], ans);
    cout << ans << endl;
    return 0;
}

笔试能力提升宝典 文章被收录于专栏

本专栏专注于互联网大厂春招、秋招笔试编程真题的深度解析与实战演练,助你轻松攻克笔试难关。无论你是应届毕业生,还是准备跳槽的职场人,这里都有你需要的干货内容。我们精选了一线互联网企业的经典笔试题目,涵盖数据结构、算法、动态规划、字符串处理等高频考点,并提供详细的解题思路与代码实现。通过本专栏,你将掌握笔试核心技巧,提升编程实战能力,轻松应对大厂笔试挑战。快来加入我们,开启你的大厂求职之旅吧!

全部评论
需要自己處理輸入輸出嗎
点赞 回复 分享
发布于 03-19 18:08 江苏

相关推荐

T1&nbsp;模拟,送分T2&nbsp;a升序sort,b降序sort,前一半加a[i]后一半减a[i],b反着来就行T3&nbsp;排列数+快速幂&nbsp;没了
又熬夜了的布莱恩很有胆量:排列数部分有什么优化吗,循环算排列数*快速幂只有20%
投递蚂蚁集团等公司10个岗位 > 笔试
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务