【题解】「NOIP2024模拟赛24 T2」子序列们

【题解】「NOIP2024模拟赛24 T2」子序列们

https://www.becoder.com.cn/contest/5715/problem/2


Description

给定一个 0/1 串 a,你需要生成一个长度为 n 的序列 b,其中 bia 的一个子序列,且满足:

  1. |bi|=ni+1
  2. i(1,n]bibi1 的子序列。

b​ 本质不同的个数。

数据范围:1n400


Solution

题目其实就是要我们确定每个元素的删去时间,这个时间是一个排列。

(当然,我们不能直接用 n! 然后去重,因为去重的时候仍涉及某个部分的方案数,所以不如直接面对本质不同的方案数。

考虑什么时候会出现重复。

当存在两个相同值的元素相邻的时候就选其中一个和其她是完全相同的。

所以我们钦定,出现这种情况的是后必定先取前面的。

怎么刻画这件事情?

Motivation: 上面这种情况有可能在删去某一个元素后新出现,比如 101 中删去 0。

所以,我们考虑的因素应该包含:删去时间、元素值。

i 的删除时间为 ti

于是,我们钦定的要求也就等价于:对于一个 iji 左边第一个 tj>ti 的元素,那么需要满足 ajai


考虑 dp。

时间实际上是和 |bi| 息息相关的,我们可以不用在状态里面考虑。

考虑区间 dp。

设:fi,j 表示将 [i,j] 删除到只剩一个元素时,或者说确定了这个区间内所有元素的 ti,满足 tj+1>tk,k[i,j](将 tj+1 换成 ti1 是等价的。

dp 转移的时候需要满足一些条件?那就在状态里面做手脚。

此时枚举,区间中最后被删去的元素 k,那么她一定不能等于 aj+1,剩下就分成了完全独立的两个子区间。

那么这样就有转移:(规定 an+10/1

fi,j=k=ij(jiki)fi,k1fk+1,j[akaj+1]

posted @   CloudWings  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示