分割01串/最大子段和——cf 1370E

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分割01串/最大子段和——cf 1370E相关的知识,希望对你有一定的参考价值。

这题转化一下,就是弄出个01串,然后问最少可以分割成多少个01串

怎么求?贪心策略,如果当前全是0结尾串,又来了一个0,那么只能又多了一个0结尾串,如果来的是1,那么就少了个0结尾串,多了个1结尾串

看了下正解貌似是求最大子段和。。

#include<bits/stdc++.h>
using namespace std;
#define N 4000005
 
int n,p,ans;
char a[N],b[N],s[N];
 
void solve(){
    int tot1=0,tot0=0;
    for(int i=1;i<=p;i++){
        if(s[i]==0){
            if(tot1)tot1--,tot0++;
            else tot0++;
        }else {
            if(tot0)tot1++,tot0--;
            else tot1++;
        }
        ans=max(ans,tot1+tot0);
    }
}
 
int main(){
    cin>>n;
    cin>>(a+1)>>(b+1);
    int x,y;
    x=y=0;
    for(int i=1;i<=n;i++){
        if(a[i]==1)x++;
        if(b[i]==1)y++;
    }
    if(x!=y){puts("-1");return 0;}
    
    for(int i=1;i<=n;i++)
        if(a[i]!=b[i])s[++p]=a[i];
    solve();
    
    cout<<ans<<
;
} 

 

以上是关于分割01串/最大子段和——cf 1370E的主要内容,如果未能解决你的问题,请参考以下文章

题解环状最大两段子段和

算法笔记--最大子段和问题

最大子段和DP前缀和C. Increase Subarray Sums

最大子段和DP前缀和C. Increase Subarray Sums

最大子段和

线段树维护区间最大子段和