这题转化一下,就是弄出个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<<' '; }