题意是,给定一个长度为 n 的整数序列,需要从中选出一些位置,使得任意连续 k 个位置中至少有一个被选中,求被选中位置上的数值之和的最大可能值。
由于最后一个被选中的位置不一定在序列末尾,但它必须位于最后 k 个位置之内(否则最后 k 个位置将没有元素被选中),因此最终答案需要在 dp[n−k+1] 到 dp[n] 中取最大值。
首先考虑经典的 DP ,定义 dp[i] 为,考虑了前 i 个数,且第 i 个数必须被选中的情况下能获得的最大总和。为了方便处理边界,我们添加一个虚拟的第 0 个位置,令 dp[0]=0。
转移方程为 : dp[i]=max(dp[i−j]+a[i],dp[i]),其中 j∈[1,k],此时的复杂度为 O(nk) 并不能满足题目的要求。
给定一个长度为 n 的整数序列 a1,a2,…,an,你需要从中选出一些位置,使得任意连续 k 个位置中至少有一个被选中。在满足该条件的前提下,求出被选中位置上的数值之和的最大可能值。
序列的长度 n 满足 1≤n≤2×105,k 满足 1≤k≤n。序列中每个元素的绝对值不超过 109。
第一行包含两个正整数 n 和 k,意义如上所述。 第二行包含 n 个整数,表示序列 a1,a2,…,an,相邻整数之间用单个空格分隔。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.