O(N*N*K)的DP算法还是比较容易想到的。
但可以运用一个贪心策略把O(N*N)变成O(N)。这一点还是比较难的。。。
给个抄来的解题报告
题目意思就是说给你一段墙,有K个粉刷工,每个粉刷工站在一个位置,且每个粉刷工只能刷L连续长度的墙,且要包括他所在的位置,而且每个粉刷工刷一个单位的墙的价格也不一样,问怎么刷能达到最大价钱
先以P为关键字对工人进行排序,使这个顺序作为动态规划的阶段。
定义F[I]代表粉刷前I个栅栏最大价值,有如下状态转移方程:
F[I]:=Max{F[J]+Len*Cost}
显然,这个方程的复杂度是O(K*N*N)的,我们需要对其进行优化。
顺序枚举工人I,递减的枚举右边界J,然后定义一个变量K,初始时K=P[I],代表第I个工人粉刷的左边界。
显然F[J]:=Max{F[K-1]+(J-K+1)*Cost[I]}
现在的关键就在于维护这个K。
当递减循环到J'的时,设T=J'-Len[I]+1,当((K-1)-T+1)*Cost[I]>F[K-1]-F[T-1]时,K:=T,否则K不变。(画画图就明白了),这里表示对于下面一个右边界是否需要移动其左边界。
我差不多就是按照这个思路来的,不过我的最外面的循环是逆着的,所以方向也是逆着的。