【POJ1821】Fence(DP + 单调队列优化)

题目链接:http://poj.org/problem?id=1821

题意

有$K$个工人刷木板,木板从左到右编号为$1-N$,构成一个从$1$到$N$的序列。

第$i$个工人可以刷也可以不刷,刷的话必须连续的长度不超过$Li$的一段,且必须包含第$Si$块,他每刷一块收益为$Pi$。

每一块木板只能被一个工人刷。

总收益就是所有工人个人收益的和。

求最大总收益。

数据范围:$1 <= N <= 16000, 1 <= K <= 100, Pi <= 10000$。

分析&做法

结合数据范围可知这显然这是一道序列DP问题。

但是需要转化一下,工人的顺序是无序的,我们按照工人的$Si$从小到大对他们拍一下序就好了。

设$f[i][j]$表示前$i$个工人刷前$j$块木板(前$j$块木板可以有空着不刷的)的最大收益。

转移分为三种情况:

  1. 第$i$个工人什么也不做,直接由上一个人转移过来就好了:$f[i][j] = f[i - 1][j]$。
  2. 第$i$个工人不刷第$j$个格子,空过去不刷,那么可以由上一块木板转移过来:$f[i][j] = f[i][j - 1]$。
  3. 第$i$个工人刷第$k + 1$到第$j$块木板,此时枚举$k$进行转移:$f[i][j] = max{f[i - 1][k] + Pi * (j - k) | j - Li <= k <= Si - 1}$。

这种做法的时间复杂度显然是$O(N^2K)$的,超时过不了。

猜你喜欢

转载自www.cnblogs.com/blog-fgy/p/12422088.html