一道需要一定分析的 dp 题目。
Description
给定 n n n 和一个长度为 n − 1 n-1 n−1 的字符串(由 ‘<’ 和 ‘>’ 组成),求数列 1 , 2 , . . . , n 1,2,...,n 1,2,...,n 有多少种排列,使得相邻数之间的大小关系与字符串中大于号小于号相符合,答案对 1 0 9 + 7 10^9+7 109+7 取模。
- 1 ≤ n ≤ 3000 1\le n\le 3000 1≤n≤3000
Solution1
analysis
先给出本题的一个重要结论:
对于这一序列的任何一个子序列,在其内部排列时我们只需要关心每个数的大小关系,而不是每个数具体的值。
举例:
序列6,9,11
在进行内部排列时,我们可以将其视为1,2,3
。
所以:
我们只要考虑上一个数是什么,保证满足大小关系放数就行。
这样我们得到了一个显然的 dp 状态:
- d p i , j dp_{i,j} dpi,j 表示考虑到第 i i i 个位置,前面一个数是前面排列中第 j j j 大(上面已经得出结论,第 j j j 大的数就视为 j j j 参与排列)的可能数。
转移:
分为两种情况:当前的数 > 上一个数 & 当前的数 < 上一个数。
- 枚举上一个数在之前序列中大小排名 k k k,通过相对大小关系得到转移方程:
d p i , j = { ∑ k = 1 j − 1 d p i − 1 , k s i − 1 = ′ < ′ ∑ k = j i − 1 d p i − 1 , k s i − 1 = ′ > ′ dp_{i,j}=\begin{cases}\sum\limits_{k=1}^{j-1}dp_{i-1,k}&s_{i-1}='<'\\\sum\limits_{k=j}^{i-1}dp_{i-1,k}&s_{i-1}='>'\end{cases} dpi,j=⎩⎪⎪⎨⎪⎪⎧k=1∑j−1dpi−1,k