题目链接: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$块木板可以有空着不刷的)的最大收益。
转移分为三种情况:
- 第$i$个工人什么也不做,直接由上一个人转移过来就好了:$f[i][j] = f[i - 1][j]$。
- 第$i$个工人不刷第$j$个格子,空过去不刷,那么可以由上一块木板转移过来:$f[i][j] = f[i][j - 1]$。
- 第$i$个工人刷第$k + 1$到第$j$块木板,此时枚举$k$进行转移:$f[i][j] = max{f[i - 1][k] + Pi * (j - k) | j - Li <= k <= Si - 1}$。
这种做法的时间复杂度显然是$O(N^2K)$的,超时过不了。