笔记:
例题:
#include<bits/stdc++.h>
using namespace std;
const int N = 5000010;
char str[N];
int s[N];
int main(){
int t;
cin>>t;
for(int a=1;a<=t;a++){
int n;cin>>n;
scanf("%s",str+1);
for(int i=1;i<=n;i++){
s[i]=s[i-1]+str[i]-'0';//前缀和
}
int k=(n+1)/2;
int res=0;
for(int i=k;i<=n;i++)res=max(res,s[i]-s[i - k]);
printf("Case #%d: %d\n",a,res);
}
return 0;
}
这道题完全可以等价为求求长度为(n+1)/2的连续子数组的最大和,使用前缀和求和,依次遍历并求最大值。