1 条题解
-
8
Palindrome Bo
有圣贤名曰 Sam ,曾云“ Really difficult. ”。
题目链接: HDU 2016 多校 。
题目描述:
定义一个子序列合法当且仅当:
- 子序列为回文子序列。
- 子序列为单谷子序列。
给定长度 的序列 ,求其最长合法子序列长度以及本质不同的最长合法子序列个数。
我们先看第一问。可以发现,一个合法的子序列,结构必然是一个类似于“洋葱”的结构,即
ABCDEFGFEDCBA这样的结构。所以我们不妨考虑定义 表示当这个“洋葱”最外层为 和 (其中 )时的最大合法子序列长度。那么此时就有一个的显然的转移:枚举 且 ,则 ,边界情况 。
这个算法的复杂度为 。
接下来考虑优化。不妨固定左端点 ,从左往右枚举 ,并维护一个值 表示区间 里的最大 值。那么当枚举到一个 时,我们有如下两个行动:
- 若 ,则 。
- 若 ,则我们枚举一个 ,进行 。
这样就完成了转移。
上述复杂度为 。
观察一个性质:若 ,则必然有 。即,区间包含关系中较大的区间必然更优。
由此我们可以对上面的 DP 进行优化。设 表示 , 。即 前后第一个 的位置。那么固定 ,枚举 后,若 ,则不需要枚举 ,可以直接 。
这样就可以做到 ,第一问就做完了。
接下来考虑在第一问的基础上做第二问。
定义 表示最长的本质不同的子序列个数。
首先,如果没有“本质不同”的限制,则可以直接做一个简单的计数 DP 。
那么接下来,还是固定 ,枚举 ,对于 ,令 表示合法子序列长度为 时的本质不同子序列的个数。令 ,则:
- 若 ,更新 。
- 否则,若 ,此时我们执行 。但是这样我们可能会计算重复的。那么,自然的,所有与这个方案重复的方案必然也是满足 的区间 ,这个 ,由于上面的性质,可以得到 。那么只需要再让 即可。
于是这道题我们就做完了。复杂度 。
- 1
信息
- ID
- 2752
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 23
- 已通过
- 5
- 上传者