十一. 最大区间和
数据
样例输入
6 3
2 3 9 1 9 5
样例输出
19
范围
评测用例规模与约定
对于 30% 的评测用例,1 <= k <= n <= 30,1 <= a[i] <= 100。
对于 60% 的评测用例,1 <= k <= n <= 1000,1 <= a[i] <= 10000。
对于所有评测用例,1 <= k <= n <= 100000,1 <= a[i] <= 1000000。
这道题上来我会先想到枚举起点,然后维护一个区间最大和。
枚举起点:
就用给的样例,可以枚举的起点和K有关系:
根据图我们发现可以枚举的起点有: 2 3 9 1
每段区间都可以用(i,i+k)来表示。其中i是一个变化的值,从0开始,i++,i到n结束。
我们可以用两重循环,一重来表示各区间段,一层用来表示各区间段内元素。
我们把各区间内元素想加求出各区间段的区间和,再比较各区间段区间和,求出最大区间和。
因此我们可以写如下代码:
我们发现这个结果并不对,这是因为temp没有被重置的原因,每枚举一个新的起点的时候,temp都应该被重置,所以temp应该放到循环内部。
这个解法的时间复杂度为O(nk)。如果我们用前缀和的话时间复杂度可以达到O(n),直接少了k倍。
前缀和解法