【总结】区间 DP
区间合并类 trick
P1880 [NOI1995] 石子合并
性质 \(1\):\(n\) 堆式子恰好合并 \(n - 1\) 次。
性质 \(2\):经过若干论合并,每一堆石子一定是原序列的一个子段。
考虑令 \(f[l,r]\) 为将区间 \([l,r]\) 内的石子合并成一堆的最小代价。
考虑最后一次合并的两堆石子对应的子段,\(O(n)\) 转移即可。
CF149D Coloring Brackets
(*性质:对于一个合法括号串右端点 \(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]\)
那么根据乘法原理,有 :
发现是一个卷积的形式。
并且状态间的乘法显然可以看成卷积:
那么对于前面 \(\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}\) 的处理是平凡的。
考虑从后面提取一个系数
那么对应的转移即 \(\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]成绩单
对于区间消除类问题,右端点一定可以调整到最后一次消除(考虑任一消除方案消除右端点的操作,将其移到最后一次操作一定合法),并且最后一次消除进行完一定是消除区间中的所有元素。
令 \(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]涂色
状态设计:令 \(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])\) 。