3367. 咸鱼翻身

10175102262 LarsPendragon

求最大区间和。思路:0被翻身后得到1,1被翻身后得到0。相当于0被翻身后1的总个数增加1,而1被翻身后1的总个数减少1。动态规划求到i截止的区间中最大的区间和(求对原数组影响值(即增加的1的个数,不可能为非正数)的最大值)。附C++代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, cnt=0, fish[100000];//cnt存初始有梦想咸鱼1的个数
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>fish[i];
        if(fish[i]) cnt++;
    }
    if(!(n-cnt)) {cout<<n-1<<endl; return 0;}//特判全部咸鱼都有梦想全都是1的情况
    int ans=0, current_fish=0;//ans求最大影响值current_fish求以第i条咸鱼作为最后一条翻身的咸鱼时最大的影响值
    for(int i=0; i<n; i++)
    {
        if(fish[i]) fish[i]=-1;
        else fish[i]=1;
        current_fish=max(0, current_fish)+fish[i];
        ans=max(ans, current_fish);
    }
    cout<<ans+cnt<<endl;//最后的输出应为初始翻身咸鱼数+影响值
    return 0;
}

本来努力了一下试图自己翻身,结果还是在大佬的帮助下才翻的身……

tyuiop

本来是翻身了的,翻身后对总的数量的贡献是-1,本来没有翻身的,翻身后对总的贡献为1
原本的0 1序列可以变成1 -1序列
可以将0 1序列中的一段翻身要最后的结果和最大
其实就是求转化为1 -1序列后的最大连续子序列和
当然算出的最大连续子序列和是翻身后的增量
结果是初始的数量加上增量

你当前正在回复 博客/题目
存在问题!