设置两个二维数组 $f$ 和 $g$,含义如下。
$f[l][r]$ 表示在期望得到的队形中 $l\rightarrow r$ 这段区间初始队形排列的方案数,并且最后一个加入进去的是第 $l$ 个人。
$g[l][r]$ 表示在期望得到的队形中 $l\rightarrow r$ 这段区间初始队形排列的方案数,并且最后一个加入进去的是第 $r$ 个人。
那么可以看出来 $g[l][r]$ 可以从 $g[l][r-1]$ 跟新出来,$f[l][r]$ 可以从 $f[l+1][r]$ 跟新出来。
大致可以分为下面四种情况:
现在决策的这个人插到队伍的最左边,即当前这个人比前一个加入队列的要矮,针对 $f[l][r]$ 前一个排进去的人是在第 $l+1$ 的位置上,$f[l+1][r]\rightarrow a[l]<a[l+1]$前一个排进去的人是在第 $r$ 的位置上,$g[l+1][r]\rightarrow a[l]<a[r]$现在决策的这个人插到队伍的最右边,即当前这个人比前一个加入队列的要高,针对 $g[l][r]$ 前一个排进去的人是在第 $l$ 的位置上,$f[l][r-1]\rightarrow a[r]>a[l]$前一个排进去的人是在第 $r-1$ 的位置上,$g[l][r-1]\rightarrow a[r]>a[r-1]$根据上面的关系就可以写出状态转移方程
记得要初始化 $l=r$ 的数组,还有就是枚举区间长度的时候从 $2$ 开始枚举,否则会改变 之前初始化的数组造成答案出错
转载于:https://www.cnblogs.com/bljfy/p/9572712.html
相关资源:数据结构—成绩单生成器