【总结】区间 DP

区间合并类 trick

P1880 [NOI1995] 石子合并

P1880

性质 \(1\)\(n\) 堆式子恰好合并 \(n - 1\) 次。

性质 \(2\):经过若干论合并,每一堆石子一定是原序列的一个子段。

考虑令 \(f[l,r]\) 为将区间 \([l,r]\) 内的石子合并成一堆的最小代价。

考虑最后一次合并的两堆石子对应的子段,\(O(n)\) 转移即可。

CF149D Coloring Brackets

CF149D

(*性质:对于一个合法括号串右端点 \(pos\) 匹配的一个位置 \(loc\) ,对于任意包含 \(pos\) 的合法括号子段,其 \(pos\) 匹配的位置仍然是 \(loc\) 。)

性质:对于任意一种钦定了 \(k\) 个连续段染色的方案,该情况下的方案数为 \(2^k\) ,令 \(cnt[k]\) 为钦定 \(k\) 个连续段染色的方案数,那么总的方案数即 \(\sum_k cnt[k]\times 2^k\)

(因为我们只要确定每一段第一个位置的颜色,其他位置的颜色一定是唯一确定的,每段第一个位置颜色有两种填法,因此方案数为 \(2^k\) 。)

例如对于上图来说,我们钦定了三段染色,方案数即 \(2^3\)

若区间 \([l,r]\) 是合法括号段,令 \(f[l,r,0/1,0/1]\) 为考虑子段 \([l,r]\) 且左端点不染色 / 染色,右端点不染色/染色的方案数。

\(r\) 匹配的位置 \(pr\not= l\) ,其对应着一个二区间合并。

令区间 \(S_1\) 为区间 \([l,pr-1]\) ,区间 \(S_2\) 为区间 \([pr,r]\)

\(cnt_1[k,0/1,0/1]\) 为区间 \(S_1\) 中钦定 \(k\) 段染色且左端点不染色 / 染色,右端点不染色/染色的方案数, \(cnt_2[k,0/1,0/1]\) 为区间 \(S_2\) 中钦定 \(k\) 段染色且左端点不染色 / 染色,右端点不染色/染色的方案数。

令:\(cnt_i[k,..,t] = cnt_i[k,0,t] + cnt_i[k,1,t]\)

那么根据乘法原理,有 :

\[f[l,r,t1,t2] = \sum_{k_1,k_2} (cnt_1[k_1,t1,0] \times cnt_2[k_2,..,t_2] + cnt_1[k_1,t1,1] \times cnt_2[k_2,0,t_2]) * 2^{k_1+k_2} + \sum_{k_1,k_2} cnt_1[k_1,t1,1] \times cnt_2[k_2,1,t_2] * 2^{k_1+k_2-1} \]

发现是一个卷积的形式。

并且状态间的乘法显然可以看成卷积:

\[f[l,pr-1,t_1,op_1] \times f[pr,r,op_2,t_2] = \sum_{k_,k_2} cnt_1[k_1,t_1,op_1] \times cnt_2[k_2,op_2,t_2] \times 2^{k_1+k_2} \]

那么对于前面 \(\sum_{k_1,k_2} (cnt_1[k_1,t1,0] \times cnt_2[k_2,..,t_2] + cnt_1[k_1,t1,1] \times cnt_2[k_2,0,t_2]) * 2^{k_1+k_2}\) 的处理是平凡的。

考虑从后面提取一个系数

\[\sum_{k_1,k_2} cnt_1[k_1,t1,1] \times cnt_2[k_2,1,t_2] * 2^{k_1+k_2-1} = \dfrac{1}{2}\sum_{k_1,k_2} cnt_1[k_1,t1,1] \times cnt_2[k_2,1,t_2] * 2^{k_1+k_2} \]

那么对应的转移即 \(\dfrac{1}{2}\times f[l,pr-1,t_1,1] \times f[pr,r,1,t_2]\)

对于 \(l\)\(r\) 匹配的情况可以看成单点和区间的拼接,思考方式也类似,总的复杂度为 \(O(n^3)\)

取一端 / 两端 trick

区间消除类 trick

利用问题的特殊性质的一种区间合并类 trick。

P5336 [THUSC2016]成绩单

P5336

对于区间消除类问题,右端点一定可以调整到最后一次消除(考虑任一消除方案消除右端点的操作,将其移到最后一次操作一定合法),并且最后一次消除进行完一定是消除区间中的所有元素。

\(f[l,r,Mx,Mn]\) 为消除区间 \(l,r\) 且在消掉点 \(r\) 的同时消掉 \(l\) 左边一段区间最大值为 \(Mx\) 区间最小值为 \(Mn\) 的区间最小代价(其中钦定点 \(r\) 最后一次消除)。

即消除 \([Mx,Mn][l,r]\) 且左边一段区间最大值为 \(Mx\) 区间最小值为 \(Mn\) 的最小代价。

转移考虑区间的左端点是否和右端点一起删除。

若左端点和右端点一起删除,决策为: \(f[l+1,r,\max(Mx,w[l]),\min(Mn,w[l])]\)

若左端点和右端点不在一起删除,考虑枚举左端点删除时的子序列对应的极右端点 \(pos\)

考虑一个性质:若删除左端点 \(l\) 时对应的子序列的右端点为 \(pos\) ,那么在删除左端点 \(l\) 后,区间 \([l,pos]\) 内的所有元素一定均被删除,且在左端点删除前一定不存在一个删除操作对应的子序列左端点在 \([l,pos]\) ,右端点在 \([pos+1,r]\)

所有,对于所有删除左端点 \(l\) 时对应的子序列的右端点为 \(pos\) 的方案,最后消除区间 \([l,r]\) 的方案一定可以分成互不影响的两部分:将区间 \([l,pos]\) 消除,将区间 \([pos+1,r]\) 消除且在消除 \(r\) 时消除最左侧的 \([Mx,Mn]\)

因此可以直接枚举删除左端点 \(l\) 时对应的子序列的右端点 \(pos\) ,对应的转移为:\(f[l,pos,-inf,+inf] + f[pos+1,r,Mx,Mn]\)

总的复杂度为 \(O(n^5)\)

区间涂色类 trick

利用问题的特殊性质的一种区间合并类 trick。

P4170 [CQOI2007]涂色

P4170

状态设计:令 \(f[l,r]\) 为将区间 \([l,r]\) 涂完的最少涂色次数。

状态转移:

  • 性质 \(1\) : 对于任一不存在同时涂端点 \(l,r\) 的最优解,一定存在一个分界线 \((i,i+1)\) 满足不存在一次染色同时给 \(i\)\(i+1\) 染。

  • 性质 \(2\) :对于任一包含区间端点的染色操作,都可以提到第一次执行,对于后续任一包含该区间内的操作进行调整(\([L,R] \to [L,pos]\) ),不影响正确性。

  • 划分依据:按是否同时涂 \(l,r\) 分类即可。

具体地:若 \(col[l] = col[r],f[l,r] = f[l+1,r]\) 否则 \(f[l,r] = \min_{k}(f[l,k]+f[k+1,r])\)

posted @ 2021-08-31 15:13  Themaxmaxmax  阅读(55)  评论(0编辑  收藏  举报