神仙题,感觉思路太神奇
题目等价于每次向序列里面插入一个新数,问有多少种方案
我们考虑怎样插入一个新数是合法的,假设当前插入的数是cur,那么有两种情况
1. cur放在序列的末尾
2. cur之后第一个与cur不一样的数比cur小(或者cur后面的数全都和cur一样)
我们发现改一下这个问题的初始条件,不是空序列,而是一个包含一个0的序列,这两种情况就变成只有第二种情况了,而且括号里的部分也不用考虑
接下来是神奇的部分
所以每个数被插入的时候都能在后面认领到一个唯一的比他小的数,这很像一个树的结构:每个点对应一个唯一的父亲
我们考虑用一个二元组(t,cur)来表示树上的每一个节点,t表示这是第几个被插入的数,cur表示这个插入的数是什么,那么(t,cur)和他的父亲(t’,cur’)之间应该满足t>t’,cur>cur’
所以我们的问题转化成了:按照上述规则建立一棵树,不同构的树有多少棵(这里同构不止要求形态相同,上面的二元组也要相同)
考虑树型dp,dp[i][j]表示有i个点的树,根节点的cur值是j的树有多少棵
转移考虑枚举这棵树的最后一棵子树的点的个数p,显然根据上面的规则它的根节点可以是j+1,j+2…k,又考虑到不能把同构的树重复计算,所以我们可以利用一种类似最小表示法的思想,我们保证这棵树编号最大的点在最后一棵子树上,这样除去原树的根节点和已经确定的编号最大的节点,我们还剩i-2个编号,要再给最后一个子树分配p-1个编号,这里可以用一个组合数
状态转移方程是
AtCoder Grand Contest 024E: Sequence Growing Hard 题解
最新推荐文章于 2019-12-26 10:40:28 发布
dp[i][j]=∑p=1i−1