当前位置: 首页 > 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.hskmm.com/?act=detail&tid=31903

相关文章:

  • 结果(Results)和结论 (Conclusion)的联系与区别
  • 【训练技巧】PyTorch多卡训练模型DistributedDataParallel和DataParallel设置方法详解及分布式训练命令解释 - 实践
  • 软件工程学习日志2025.10.15
  • newDay11
  • 向下填充(间断性)
  • 20251015
  • java date 初始化指定时分秒及比较日期大小
  • 轻量级ChatGPT克隆版nanochat技术解析
  • 10.15 —— 2020icpc上海D
  • [QOJ888] Travel around China 题解
  • MySQL面试必考:从入门到精通的20个问题
  • 手撕大模型 | MQA 和 GQA 原理解析
  • P1912 [NOI2009] 诗人小G 分析
  • [COCI2022-2023#2] Tramvaji 题解
  • 一级指针和二级指针作为函数参数的区别
  • ROUGE指标
  • CSP-S 模拟 29
  • Linux 文件及相关安全操作指南
  • day012
  • 怎么能把一个横着的很长的excel表,输出成一个能完整展示在一个页面中的PDF
  • 高精度
  • 深入解析:Leetcode+Java+图论+岛屿问题
  • 简单介绍
  • agent技术框架
  • agent认知与原理分析
  • agent策略分析与Parer解读
  • Visual Studio 2022连接mysql数据库,解决System.Data.Odbc.OdbcException (0x80131937)
  • day05
  • [AI生成]Spark-TTS个人理解
  • 2025.10.3 测试