6444 最大 k 段子段和

暂无评定 传统题 动态规划最大子段和 上传者
时间限制3000ms
内存限制256MiB
通过 / 提交0/0

6444最大 k 段子段和

暂无评定 传统题 动态规划最大子段和 上传者
时间限制3000ms
内存限制256MiB
通过 / 提交0/0

题目描述

给定一个长度为 nn 的整数序列 a1,a2,…,ana_1,a_2,\ldots,a_n 和一个整数 kk,请选取恰好 kk 段互不重叠的非空连续子段,使所选元素之和最大。

子段之间可以相邻,但不能包含同一个位置。形式化地,选取 kk 个区间 [l1,r1],[l2,r2],…,[lk,rk][l_1,r_1],[l_2,r_2],\ldots,[l_k,r_k],满足:

1≤l1≤r1<l2≤r2<⋯<lk≤rk≤n1\le l_1\le r_1<l_2\le r_2<\cdots<l_k\le r_k\le n

求这些区间中所有元素的和的最大值。序列是线性的,首尾不相接。

输入格式

第一行输入两个整数 n,kn,k。

第二行输入 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n。

输出格式

输出一个整数,表示恰好选择 kk 段时的最大总和。不需要输出所选区间。

样例 1

5 2
2 -5 4 3 -1
9

样例 1 说明

选择区间 [1,1][1,1] 和 [3,4][3,4],对应 2 和 4 3,总和为 99。

样例 2

4 3
-5 -1 -3 -2
-6

样例 2 说明

选择区间 [2,2][2,2]、[3,3][3,3] 和 [4,4][4,4],总和为 −1−3−2=−6-1-3-2=-6。必须选满 33 段,不能只选择 −1-1。

样例 3

3 3
1 2 3
6

样例 3 说明

三个子段可以分别为 [1,1][1,1]、[2,2][2,2] 和 [3,3][3,3]。相邻的子段允许分别计为一段。

数据范围与评分

对于所有数据,1≤k≤n≤2000001\le k\le n\le200000,n×k≤2×107n\times k\le2\times10^7,−109≤ai≤109-10^9\le a_i\le10^9。

测试组 分值 额外限制
1 20 n <= 20
2 30 n <= 2000 且 k <= 20
3 50 无

各组独立计分,只有通过一组内的所有测试点,才能获得该组分数。

答案可能超出 32 位整数的范围,请使用 64 位整数类型(如 C++ 的 long long)。