1 条题解
-
0
题目解法概述
问题转化
我们需要计算满足条件的序列对 的数量,其中:
- 严格递增
- 所有 是 到 的一个排列
- 对每个 成立
- 改进的算法(最优算法)比原算法(贪心算法)选择更多活动
关键观察
- 原算法性质:原算法是按照 递增顺序的贪心算法,每个活动如果与已选活动不冲突就选择
- 最优算法:通过动态规划可以找到最大不相交区间数
- 差异条件:需要原算法选择的活动数 (因为最优算法总能选到 个?实际上最优算法最多选 个,但需要原算法选择的活动数严格小于最优算法选择的活动数)
主要步骤
1. 建立双射
将每个 序列映射为一个 的排列 ,其中:
- 位置 放
- 位置 放
这建立了 与满足特定条件的排列之间的双射。
2. 栈模型表示
考虑将排列视为括号序列:
- 数字 在 到 之间视为左括号
- 数字 视为对应的右括号
那么一个合法的 对应一个括号序列,其中左括号严格递增出现。
3. 原算法分析
在原算法中,按 顺序(即左括号出现顺序)处理:
- 选择当前活动当且仅当它不与已选活动冲突
- 等价于贪心选择最早结束的活动
这对应到括号序列中:原算法选择的区间数等于序列的 栈深度 的最大值减 1?实际上更精确地,原算法选择的活动数等于某种 最大匹配 的大小。
4. 最优算法分析
最优算法选择的最大不相交区间数等于序列的 Dyck 路径 的高度或某种统计量。
5. 计数方法
设 表示长度为 的合法括号序列中,原算法选择 个区间的方案数。
我们需要计算:
其中 是原算法选择的活动数(最优算法总是选择 个?实际上需要 )。
更精确地,设:
- = 原算法选择 个活动的方案数(此时最优算法也选 个)
- 我们需要:总方案数 -
总方案数是 Catalan 数 。
递推公式
通过分析括号序列结构,可以得到递推:
设 表示 个位置的序列,原算法选择 个区间的方案数。
考虑第一个左括号匹配的右括号位置 :
$$dp[n][k] = \sum_{j=1}^{n} \sum_{k_1+k_2 = k-1} dp[j-1][k_1] \times dp[n-j][k_2] \times \binom{2n-2}{2j-2} $$边界:
优化计算
直接计算 太慢,需要优化:
-
生成函数:设
$$F_n(x) = x \sum_{j=1}^{n} F_{j-1}(x) \cdot F_{n-j}(x) \cdot \binom{2n-2}{2j-2} $$ -
卷积优化:使用 FFT 或 NTT 加速卷积,复杂度
-
最终答案:
$$ans = C_N - \sum_{k=0}^{N} [k \text{ 是最大可能值}] dp[N][k] $$实际上,当原算法达到最大可能值时,两个算法结果相同。
具体实现
- 预处理组合数模
- 计算 使用分治 FFT
- 答案为: 因为当原算法能选 个活动时,两个算法结果相同。
时间复杂度
- 朴素 DP:
- 优化后: 或
公式总结
令 为卡特兰数。
答案:
$$ans = C_N - \sum_{k} [\text{原算法选 } k \text{ 个且是最优}] dp[N][k] $$简化版本(通过分析):
但实际更复杂,需要精确计算 。
- 1
信息
- ID
- 6117
- 时间
- 6000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者