1 条题解
-
0
题解
思路
先按座位 递增排列工人。若两个被选区间分别属于座位更靠左和更靠右的工人,则前一个区间一定完全位于后一个区间左侧。于是可以用已经处理的木板前缀描述状态。
做法
两个结构子任务
若所有 ,工人只能粉刷互不相同的 ,答案为 。若 ,正利润保证最优区间长度为 ,答案为 。
二次动态规划
令 表示只考虑前 名工人,并且只使用前 块木板时的最大收入。第 名工人粉刷 到 时,需要
转移为
$$dp_i[j]=\max\left(dp_{i-1}[j],dp_i[j-1],\max_x\{dp_{i-1}[x]+(j-x)P_i\}\right).$$直接枚举 的复杂度为 。
单调队列优化
把最后一项改写为
随着 递增,合法 构成滑动窗口 。用单调队列维护其中 的最大值,即可在均摊 时间完成一次转移。
每名工人结束后, 保证可以跳过未粉刷的木板;
dp_{i-1}与dp_i必须分离,避免同一名工人被重复使用。正确性
按 排序后,当前工人的非空区间包含 。任何更早工人的非空区间若与它不相交,只能结束在当前区间起点之前,因此某个唯一的 将两部分分开。转移枚举了所有合法 ,也允许当前工人不工作和末尾木板不粉刷,所以不会遗漏。反之,每次转移拼接的两部分不重叠,且新区间包含 、长度不超过 ,因此一定合法。归纳可得最终状态等于最优收入。
复杂度
满分算法时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 987
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者