【2018.10.2】纸条

【题目描述】

纸上有一排数,共 $n$ 个。数与数之间的间距是相同的,从左到右第 $i$ 个数为 $A_i$ 。
你有 $k$ 个长度为 $w$ 的纸条,每个纸条最多可以覆盖连续 $w$ 个数。我们需要求出被覆盖的数的总和最大是多少。
其中:纸条可以重叠,一个数被覆盖多次只算一次。纸条可以折叠后使用,即不要求纸条一定要覆盖 $w$ 个数,可以覆盖小于 $w$ 个的数。纸条也不用全部都被用上。

【输入格式】

从文件 paper.in 中读入数据。
第一行 $3$ 个整数 $n,k,w$,分别表示数的个数、纸条的长度和纸条数量。
第二行 $n$ 个整数,第 i 个数表示 $A_i$ 。

【输出格式】

输出到文件 paper.out 中。
输出一行一个整数,表示被覆盖的数的总和的最大值。

【样例 1 输入】

9 2 3
2 8 5 1 9 6 9 3 2

【样例 1 输出】

39
【样例 2 输入】

5 4 3
1 -1 -1 -1 1

【样例 2 输出】

2


 第一眼可以想到一个$O(nkw)$的dp:dp[i][j] 表示在第 1~i 个数中,用了 j 张纸条时能覆盖到的最大和。

 转移方程就是 $dp[i][j]=max(dp[k][j-1]+sum[i]-sum[k])=max(dp[k][j-1]-sum[k])+sum[i]$ $|$ $i-k<=k<i$ 其中sum[i]表示第 1~i 个数的和

 然后发现只设了两维状态,却多了一层循环,那层循环干嘛用的?

 一看,对于不同的纸条数 j,取前k位 dp值减去分数前缀和 的最大值……

 所以这不是用 k 个单调队列优化的dp裸题么……

 时间复杂度$O(nk)$。

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/9737369.html