二维动态规划

在二维动态规划中,往往会有两个维度上的限制,此时,可以通过加维、换状态、改变枚举顺序来实现消除这两个维度的限制,但有时,往往需要分析

[P5664] Emiya 家今天的饭

分析题目,易知烹饪方法可以通过顺序枚举取消后效性,而主要食材加维、换序都不行,考虑别的道路

反向考虑,容斥原理

当正向思路受到阻塞时,可以尝试逆向思考

观察限制:每种主要食材至多在一半的菜中

反向考虑时,发现不合法方案中,在一半以上的菜中的主要食材只会有一种(不可能有两个一半以上),此时我们需要维护的只有该主要食材的状态,加维即可

f[i][j][k][l]为第i种主要食材非法,取到第j种方法,该食材取了k个,其他取了l个的方案数(自己推方程)

剪枝优化

推出上面的方程发现是O(mn3)

观察方程:

(转移方程自己推)

ans=i=1mk=0nl=0k1f[i][n][k][l]

首先,对于f[i][j][][]k,l取值不会影响转移方程

其次,最后取得答案皆为k>l

因此,我们可以把k和l的差值相同的状态压到一起,通过取kl>0的状态统计答案

如何证明正确性?

1、由于转移方程相同,可以保证状态的正确转移,只要初始化时塞一起,就是正确的;

2、差值可以描述全部状态;

3、取出答案时,因为kl>0保证了它就是非法情况,统计正确;

注意k,l不能为总菜数、该食材菜数,此时用差值维护的话不一定全都非法(如差值3可以是4-1),可能会有式子使得它能够统计,但是像差值这么简单的大概没有罢(

总结

*&(#^&^*@#&@

思维强度太高了

Update:2023.3.28

写出来力,但是处理差分负权时把边界[1,2n]写成[1,2m]了……

总之,容斥和压缩都是常见方法,标蓝很合理

[P2051] [AHOI2009] 中国象棋

题意:每行每列不超过2个棋,求方案数

行内元素a[i][j]过于一般,没有什么吸引人的特殊性质(因为没有值,大家都长得一样,甚至支持列之间交换),而且每行只能有2个,联想状压,所以考虑整行作状态

此时第一维限制处理掉了,第二维考虑加维

看到列支持交换,一个思路是将列有序化再组合,另一个思路是将列的整体性质记录

记录有几列取了0个/1个/2个即可,状态完全,支持转移

posted @   Zhone_lb  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示