Palindrome Bo

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) 。