区间dp-luogu3205[HNOI2010]CHORUS 合唱队

        区间dp

介绍

      区间dp属于线性dp的一种,它以区间长度作为dp的stage,使用区间左、右端点来描述每个维度。在区间dp中,一个状态由若干个比它更小切且包含于它的区间所代表的状态转移而来,因此区间dp的决策往往是划分区间的方法。

实现

        初态一般由长度为1的“元区间”构成,枚举时先枚举阶段长度,再枚举左端点下标,由此计算右端点下标。

例题(luogu3205[HNOI2010]CHORUS合唱队)

思路

时光倒流

    对于最终序列的一个区间[l,r],最后一个添加的只可能是第l个人或者第r个人。如果最后一个是l,则对于这个区间,a[l]<a[l+1]或者a[l]<a[r]。如果最后一个是r,则对于这个区间a[r]>a[r-1]或者a[r]>a[l]。

   定义f[l,r][0]表示在最终序列区间序列[l,r]中,最后一个添加的人是l时所得到的方案数,f[l,r][1]表示在最终序列区间序列[l,r]中,最后一个添加的人是r时所得到的方案数。[l,r]这个区间可以从[l+1,r]和[l,r-1]转移过来,判断最后这个人和上一个人的大小关系,分成两类:除去最后这个人,上一个人添加在区间左边/右边。

动态转移方程如代码

代码

总结

1.初始化的时候不能对同一个区间两个方向都赋值,不然答案会*2

2.先枚举阶段长度(因为每一个区间都是由比它小的区间转移而来的)



猜你喜欢

转载自blog.csdn.net/zi_wan/article/details/80156349
今日推荐