当前位置: 首页 > news >正文

CF2021D 题解 | dp

传送门

题意

给你一个 \(n\)\(m\) 列的矩阵,要求对于每行选出一个区间 \([l_i, r_i]\),得到 \(\sum _ {j = {l_i}} ^ {r_i} a_{i, j}\) 的权值。

区间之间有限制:

\[\exists j, j \in [l_{i - 1}, r_{i - 1}], j \in [l_i, r_i] \]

\[\exists j, j \not \in [l_{i - 1}, r_{i - 1}], j \in [l_i, r_i] \]

求最大权值。

思路

显然这是一个 dp 题。

考虑朴素的状态设计 \(f_{i, l, r}\) 表示计算了前 \(i\) 行,第 \(i\) 行选区间 \([l, r]\) 的最大权值。
显然状态数 \(O(nm^2)\) 直接倒闭。

我们试图转换题目限制,可以发现,相当于是限制 \(l_{i - 1}, r_{i - 1}\) 至少有一个在区间 \((l_i, r_i)\) 中。

那也就是说,我们没有必要记录左右端点,于是得到状态优化:
\(f_{i, j, 0/1}\) 表示计算前 \(i\) 行,第 \(i\) 行选择的左(\(0\))/ 右(\(1\))端点是 \(j\),此时的最大权值。

可以启发想到这一点的例子:

\(i - 1\) 行的左右端点分别是 \(l', r'\),第 \(i\) 行左右端点是 \(l, r\)

考虑情况 \(l \lt l'\),则 \(r\) 的限制只有 \(r \ge l'\),显然没有必要记录 \(r'\),可以启发优化状态。

接下来就是分类讨论:

250910_1

case 1: \(l \lt l'\)

此时要求满足 \(r \ge l'\)

\[f_{i,l,0} = \max _ {l' = l + 1} ^ m f_{i - 1, l', 0} + calc1(l, l') \]

其中 \(calc1(l, r)\) 表示所有区间 \([L,R], L = l, R \ge r\)\(\sum _ {j = L} ^ R a_j\) 最大的值。

\[calc1(l,r) = \max _ {j = r} ^ m \left( s_j - s_{l - 1} \right) \]

\[\begin{align} calc1(l,r) = \max _ {j = r} ^ m \left( s_j - s_{l - 1} \right) \\ = \max _ {j = r} ^ m \left( s_j \right) - s_{l - 1} \end{align} \]

http://www.wxhsa.cn/company.asp?id=672

相关文章:

  • Caffeine缓存
  • Spark面试题清单
  • RocketMQ知识点梳理
  • Tekla坐标定位插件源码
  • 记录 使用PsExec启动System权限的WPF 程序
  • std::map的基本用法
  • 力扣20题 有效的括号
  • 2025年9月10日学习笔记之keil软件仿真调试
  • MySQL的explain使用
  • 力扣19题 删除链表的倒数第N个结点
  • 基于LZO的无损数据压缩IP,高性能压缩速率32Gbps,适用于FPGAASIC
  • IDEA创建文件时如何自动生成头部文档注释(简单、实用)
  • 一文带你吃透Power Platform,开启低代码开发新世界
  • docker compose 启动 redis 服务
  • MBR引导的OS Bootloader遇到被bios无视引导(自动重启)的解决办法
  • #java作业
  • 【Qt6】qt6下载地址
  • QOJ1838 Intellectual Implementation 题解
  • OpenSSH漏洞修复
  • 力扣15题三数之和
  • some plan
  • 利用废弃硬件中的零日漏洞:从Netgear路由器到BitDefender盒子的攻击链分析
  • ECT-OS-JiuHuaShan框架:自然规律的具象化智能体(附《易经》类比解析)
  • 力扣第5题最长回文子串
  • 用 Python 和 PaddleOCR 进行验证码识别
  • TASK 1 训练一个网络识别手写数字
  • 复杂背景验证码的识别思路与图像处理方法
  • Symfony学习笔记 - The Symfony Framework Best Practices
  • 大学军训
  • Vue Day3【综合案例2】vue小兔鲜儿