题解

一个字符只有 被选 和 不被选 两个状态(被选 需要满足条件 s[i] != s[i - 1])

所以 状态设置成 dp[N][2];

当不选的时候 dp[i][0] = max(dp[i - 1][1],dp[i - 1][0])

dp[i][1] = dp[i][0];

当 满足条件 时,dp[i][1] = max(dp[i][0], dp[i -1][0] + a[i] + a[i - 1])

记得long long

void solve()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    scanf("%s", s + 1);

    for (int i = 2; i <= n; i++)
    {
        dp[i][0] = max(dp[i - 1][1], dp[i - 1][0]);
        if (s[i] != s[i - 1])
            dp[i][1] = max(dp[i][0], dp[i - 1][0] + a[i - 1] + a[i]);
        else
            dp[i][1] = dp[i][0];
    }
    printf("%lld", max(dp[n][1], dp[n][0]));
}

}

全部评论

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务