我们可以将问题化简为:选中两个下标i,j 使得 j−i>K 。然后在前缀[1,i] 和 后缀[j,n] 内分别寻找两个子段使得和最大。
现在我们需要在前缀[1,i] 中寻找最大子段和。那么根据【动态规划4】最大子段和 我们直接求解,答案为max{dp1,dp2,...,dpi}
又由于这个下标 i 是频繁变化的,所以我们需要对每个不同的 i 都求解一遍答案。那么根据上节课所学的知识,我们可以预处理出dp数组的前缀最大值数组。
给定长度为m的整数列b1,b2,...bm。需要恰好挑出两段非空子段。所谓子段,就是原列里一段连续位置。这两段不许共用任何位置,并且二者之间相隔得大于g。比方说,挑[1,5]与[8,10]在g=2时允许,可一旦g≥3便不允许。
请让这两段里整数加总尽可能大,并给出该最大值。
首行读入一个正整数q,代表有多少组测试。
每一组测试里,先在一行读入两个整数m,g。下一行读入m个整数b1,b2,...bm。
1≤m≤105,−104≤bp≤104,0≤g≤m−2,1≤q≤5
每一组测试都要打印一行整数,即该组的答案。
输入
3
4 1
-4 -1 -2 -3
5 1
6 -3 2 -4 8
6 0
3 -10 4 5 -1 6
输出
-4
14
17
说明
第一组测试,只能挑[2,2]与[4,4],得到−1+(−3)=−4。
第二组测试,可以挑[1,1]与[5,5],得到6+8=14。
第三组测试,可以挑[1,1]与[3,6],得到3+4+5+(−1)+6=17。
开通会员即可查看完整视频题解: 1.题目讲解 2.思路分析 3.逐行代码手写
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册