笔记:
例题:
#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的连续子数组的最大和,使用前缀和求和,依次遍历并求最大值。