在二维动态规划中,往往会有两个维度上的限制,此时,可以通过加维、换状态、改变枚举顺序来实现消除这两个维度的限制,但有时,往往需要分析
[P5664] Emiya 家今天的饭
分析题目,易知烹饪方法可以通过顺序枚举取消后效性,而主要食材加维、换序都不行,考虑别的道路
反向考虑,容斥原理
当正向思路受到阻塞时,可以尝试逆向思考
观察限制:每种主要食材至多在一半的菜中
反向考虑时,发现不合法方案中,在一半以上的菜中的主要食材只会有一种(不可能有两个一半以上),此时我们需要维护的只有该主要食材的状态,加维即可
设\(f[i][j][k][l]\)为第i种主要食材非法,取到第j种方法,该食材取了k个,其他取了l个的方案数(自己推方程)
剪枝优化
推出上面的方程发现是\(O(mn^3)\)的
观察方程:
(转移方程自己推)
\[ans=\sum^m_{i=1}\sum^n_{k=0}\sum^{k-1}_{l=0}f[i][n][k][l] \]首先,对于\(f[i][j][][]\),\(k,l\)取值不会影响转移方程
其次,最后取得答案皆为\(k>l\)
因此,我们可以把k和l的差值相同的状态压到一起,通过取\(k-l>0\)的状态统计答案
如何证明正确性?
1、由于转移方程相同,可以保证状态的正确转移,只要初始化时塞一起,就是正确的;
2、差值可以描述全部状态;
3、取出答案时,因为\(k-l>0\)保证了它就是非法情况,统计正确;
注意k,l不能为总菜数、该食材菜数,此时用差值维护的话不一定全都非法(如差值3可以是4-1),可能会有式子使得它能够统计,但是像差值这么简单的大概没有罢(
总结
*&($#^&^*@#$&@
思维强度太高了
\(Update:2023.3.28\)
写出来力,但是处理差分负权时把边界\([1,2n]\)写成\([1,2m]\)了……
总之,容斥和压缩都是常见方法,标蓝很合理
[P2051] [AHOI2009] 中国象棋
题意:每行每列不超过2个棋,求方案数
行内元素\(a[i][j]\)过于一般,没有什么吸引人的特殊性质(因为没有值,大家都长得一样,甚至支持列之间交换),而且每行只能有2个,联想状压,所以考虑整行作状态
此时第一维限制处理掉了,第二维考虑加维
看到列支持交换,一个思路是将列有序化再组合,另一个思路是将列的整体性质记录
记录有几列取了0个/1个/2个即可,状态完全,支持转移
标签:状态,方程,sum,食材,二维,差值,加维,动态,规划 From: https://www.cnblogs.com/zhone-lb/p/18522178