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

CF2143D2

给定长度为 \(n(n \le 2000)\) 的序列 \(a\),询问有多少个子序列满足不存在长度 \(\ge 3\) 的下降子序列。

显然可以 DP,令 \(dp_{i, j, k}\) 表示前 \(i\) 个数组成的子序列,最大值为 \(j\),长度为 \(2\) 的下降子序列第二个元素最大的为 \(k\) 的方案数。考虑转移:

  • \(a_i < k\),形成了长度为 \(3\) 的下降子序列,不能转移。
  • \(k \le a_i < j\)\(dp_{i, j, k} \rightarrow dp_{i, j, a_i}\)
  • 否则,\(dp_{i, j, k} \rightarrow dp_{i, a_i, k}\)

然后你就得到了一个 \(O(n ^ 3)\) 的做法,可以通过 D1。

考虑优化,不难发现对于每个 \(i\) 转移时只会贡献到最多 \(2n\) 个状态。于是可以枚举这 \(2n\) 个状态,使用树状数组维护转移即可(单点加,求前缀和)。时间复杂度:\(O(n^2 \log n)\)

一些细节:开两个树状数组分别维护 \(j\) 固定和 \(k\) 固定的 DP 值。

此题观察到转移只会贡献 \(2n\) 个状态就很简单了。

http://www.rkmt.cn/news/21888.html

相关文章:

  • 【训练技巧】PyTorch多卡训练模型DistributedDataParallel和DataParallel设置方法详解及分布式训练命令解释 - 实践
  • C++篇:007
  • C++篇:006
  • C++篇:004
  • 轻量级ChatGPT克隆版nanochat技术解析
  • 10.15 —— 2020icpc上海D
  • Linux 文件及相关安全操作指南
  • 怎么能把一个横着的很长的excel表,输出成一个能完整展示在一个页面中的PDF
  • agent技术框架
  • 夸克网盘免费扩容,新用户轻松领取1TB免费空间!一步一步教你如何操作! - 详解
  • [AI生成]Spark-TTS个人理解
  • [20251014]建立完善通用的prx.sql脚本.txt
  • 复杂版式与印章干扰下的高精度社会团体法人登记证书识别技术
  • 征程 6 | BPU trace 简介与实操
  • 实验任务2
  • 2025 年风淋室厂家选哪家?广州灵洁凭技术专利与全链服务打造净化设备优质之选
  • Spring bean初始化过程
  • 【Windows】如何管理电脑磁盘文件,保持简洁 - 教程
  • 范围综述
  • 低代码软件开发流程
  • CSP-S模拟30
  • 2025多校冲刺CSP模拟赛5
  • 应用安全 --- 安卓神器 之 入口加密
  • 读书报告和代码
  • P66实训2
  • const int *p和int *const p快速区分
  • pytorch作业
  • pytorch实验题作业
  • P14223 [ICPC 2024 Kunming I] 乐观向上
  • C 语言 - 内存操作函数以及字符串操作函数解析