PKU 1821 Fence(原来DP也是会超时的。。)

本文介绍了一种将O(N*N*K)的DP算法优化为更高效的解决方案的方法,通过引入贪心策略将复杂度从O(N*N)降低到O(N)。针对一道关于分配多个粉刷工以最大化总收益的问题,文章详细阐述了如何利用动态规划和贪心思想来求解,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不变。(画画图就明白了),这里表示对于下面一个右边界是否需要移动其左边界。

 

 

我差不多就是按照这个思路来的,不过我的最外面的循环是逆着的,所以方向也是逆着的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值