1 条题解

  • 8
    @ 2026-9-23 16:54:44

    Palindrome Bo

    有圣贤名曰 Sam ,曾云“ Really difficult. ”。

    题目链接: HDU 2016 多校 。

    题目描述:

    定义一个子序列合法当且仅当:

    • 子序列为回文子序列。
    • 子序列为单谷子序列。

    给定长度 n≤5000n\le 5000 的序列 a(1≤ai≤n)a(1\le a_i\le n) ,求其最长合法子序列长度以及本质不同的最长合法子序列个数。

    我们先看第一问。可以发现,一个合法的子序列,结构必然是一个类似于“洋葱”的结构,即 ABCDEFGFEDCBA 这样的结构。

    所以我们不妨考虑定义 fi,jf_{i,j} 表示当这个“洋葱”最外层为 ii 和 jj (其中 ai=aja_i=a_j )时的最大合法子序列长度。那么此时就有一个的显然的转移:枚举 i<x≤y<ji<x \le y<j 且 ax=aya_x=a_y ,则 fi,j=max⁡{fx,y+2}f_{i,j}=\max\{f_{x,y}+2\} ,边界情况 fi,i=1f_{i,i}=1 。

    这个算法的复杂度为 O(n4)\mathcal{O}(n^4) 。

    接下来考虑优化。不妨固定左端点 ii ,从左往右枚举 jj ,并维护一个值 ansans 表示区间 (i,j](i,j] 里的最大 ff 值。那么当枚举到一个 jj 时,我们有如下两个行动:

    1. 若 ai=aja_i=a_j ,则 fi,j=ans+2f_{i,j}=ans+2 。
    2. 若 ai≥aja_i\ge a_j ,则我们枚举一个 i<k≤ji<k\le j ,进行 fk,j→ansf_{k,j}\to ans 。

    这样就完成了转移。

    上述复杂度为 O(n3)\mathcal{O}(n^3) 。

    观察一个性质:若 i<x≤y<ji<x\le y<j ,则必然有 fi,j>fx,yf_{i,j}>f_{x,y} 。即,区间包含关系中较大的区间必然更优。

    由此我们可以对上面的 DP 进行优化。设 nxti,jnxt_{i,j} 表示 min⁡{k∣ak=j,i<k}\min\{k\mid a_k=j,i<k\} , prei,j=max⁡{k∣ak=j,k<i}pre_{i,j}=\max\{k\mid a_k=j,k<i\} 。即 ii 前后第一个 jj 的位置。那么固定 ii ,枚举 jj 后,若 ai≥aja_i\ge a_j ,则不需要枚举 kk ,可以直接 fnxti,aj,j→ansf_{nxt_{i,a_j},j}\to ans 。

    这样就可以做到 O(n2)\mathcal{O}(n^2) ,第一问就做完了。

    接下来考虑在第一问的基础上做第二问。

    定义 gi,jg_{i,j} 表示最长的本质不同的子序列个数。

    首先,如果没有“本质不同”的限制,则可以直接做一个简单的计数 DP 。

    那么接下来,还是固定 ii ,枚举 jj ,对于 ai≥aja_i\ge a_j ,令 cntcnt 表示合法子序列长度为 ansans 时的本质不同子序列的个数。令 k=nxti,ajk=nxt_{i,a_j} ,则:

    • 若 ans<fk,jans<f_{k,j} ,更新 ans=fk,j,cnt=gk,jans=f_{k,j},cnt=g_{k,j} 。
    • 否则,若 ans=fk,jans=f_{k,j} ,此时我们执行 cnt+gk,j→cntcnt+g_{k,j}\to cnt 。但是这样我们可能会计算重复的。那么,自然的,所有与这个方案重复的方案必然也是满足 ak=aj=axa_k=a_j=a_x 的区间 [k,x][k,x] ,这个 xx ,由于上面的性质,可以得到 x=prei,ajx=pre_{i,a_j} 。那么只需要再让 cnt−gk,x→cntcnt-g_{k,x}\to cnt 即可。

    于是这道题我们就做完了。复杂度 O(n2)\mathcal{O}(n^2) 。

    • @ 2026-10-19 19:15:48

      官方勘误:最后是 x=prej,ajx=pre_{j,a_j}。

  • 1

信息

ID
2752
时间
2000ms
内存
1024MiB
难度
8
标签
(无)
递交数
23
已通过
5
上传者