POJ_1821 Fence

1.题目相关

  • 标签DP 单调队列优化
  • 题目地址http://poj.org/problem?id=1821
  • 题目大意:有 N 块连续的木板,并有 K 个工人来粉刷,但不要求全部粉刷。每个工人有三个参数:L,P,S,表示其最多粉刷连续的 L 块木板,并且每粉刷一块木板可获得 P 元,但所粉刷的木板必须包括第 S 块。输出所能获得最大价值。

2.思路

  • 先以 S 为第一关键字排序,建立 DP 方程。
  • dp[i][j] 表示第 i 个人粉刷到第 j 块木板,所获得最大价值。
  • dp[i][j] = max{ dp[i][j-1] , dp[i-1][j] , dp[i-1][k] + (j-k)·p[i] }
  • 分别表示:第 i 个人不刷、第 j 面墙不刷、第 i 个人刷 k+1 到 j 块木板。且对于第三种,需满足 j-l[i]<=k<=s[i]-1 和 s[i]<=j<=s[i]+l[i]-1。
  • 建立方程后会发现,直接DP会TLE,所以要进行一些优化。
  • 对于第一、第二项我们可以做到n^2,所以需要着重优化第三项。
  • 整理后可以发现其可以转化为 dp[i-1][k]+k×p[i] 和 j×P[i] 这两项。
  • 其中前一项可视为关于 k 的函数,后一项则是常数。并且对于每个 j 来说最优的 k 都是递增的。
  • 所以就可以用一个值单调递减,位置单调递增的单调队列来维护。一开始把符合条件的 k 扫一遍,并维护队列。在递推时每次查看队头,若当前 k 对于 j 不符合,则出队,直至符合。

点击查看代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • thiele插值算法 1点插值算法 function [C,c]=thiele(X,Y,Z)%X为插值点横坐标,Y...
    00crazy00阅读 6,246评论 0 4
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,350评论 0 33
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 8,054评论 0 6
  • 四十岁的老N最近在学车,科目二终于学到了坡道起步。定点停车之后,五十多岁的教练告诉他,先打左转灯,再慢抬离合,听到...
    袁大锅阅读 3,730评论 0 3
  • 自恋,性和攻击。是人类所有心理和行动背后的三种基本动力。 这里我们把自恋分为几种形态?第一,全能自恋。也被称为全能...
    南方的雨中人阅读 3,685评论 0 0