1 条题解
-
0
题解
思路
分别记两行及两行之和的前缀和为 。对 ,令 为满足下列条件的最大左端点 :存在 使 。若不存在则为 。它表示在对应行集合的前 列中,右侧最靠后的零和区间从哪里开始。
设 为只允许使用第一行前 列和第二行前 列时的最优答案。考虑最右侧被选中的矩形:
- 若它只占一行,贪心选择左端点更靠右的那一行不会变差;
- 若它占两行,其右端点不能超过 ,最靠右的可选左端点为 。
于是有递推
$$F(x,y)=\max\left(0,1+\max\left(F(R(x,y)),F(t,t)\right)\right),$$其中 ,而
$$R(x,y)= \begin{cases} (p_1(x),y),&p_1(x)>p_2(y),\\ (x,p_2(y)),&\text{否则}. \end{cases}$$参数为负的状态不可行。每次转移都会减小 。
做法
算法一:单元格占用集合 DP
当 时,枚举全部三个种类的零和矩形,把它们转成不超过 位的单元格占用掩码。随后做 0/1 集合 DP,只有当前掩码与新矩形不相交时才能加入。
算法二:二维 DP
当 时,按 递增枚举所有 ,直接使用上述递推。所有依赖状态的坐标和更小,因此可以自底向上求值。
算法三:按需状态压缩
从 开始,只把递推真正访问到的状态加入记忆表。对每个 ,重要状态只有 ,以及答案恰比 多一的两个最早非对角状态;若一侧已经连续加入两个或更多行内矩形,就能先把较短侧跳到同一列而不损失最优性。因此可达状态总数为 。
标程用显式栈后序求值这些状态,避免 时递归栈过深。独立核验程序先生成整个可达状态 DAG,再按 排序求值。
正确性证明
任意好矩形只能是第一行区间、第二行区间或同时占两行的区间。固定已允许的前缀 ,取最优方案中最右侧结束的矩形。若选两行矩形,删除它后剩余方案完全位于某个相同前缀 ,取最靠右的合法左端点 最优。若选单行矩形,两个候选的左端点分别是 与 ;选择左端点更靠右者会保留另一行更多可用单元格,另一选择不可能更优。故递推穷尽最优方案且不引入相交矩形。基础值零对应不选任何矩形,归纳可知 即答案。
复杂度
三档算法的时间复杂度分别为 、 与期望 ,空间复杂度分别为 、 与 。前缀和位置表使用哈希表构造,满分算法的总期望复杂度为 。
- 1
信息
- ID
- 1486
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者