之前做过,后来忘了,回顾&复习
首先这题容易想到是容斥,因为保证所有他要求每种主要食材至多在\(\lfloor \frac{k}{2} \rfloor\)道菜中被使用(注意,这里是主要食材,不是菜的个数,别问我为什么强调这个),这说明不满足这个条件的情况最多只有一列会出现\(> \lfloor \frac{k}{2} \rfloor\)的情况
因此我们可以先求出任意选的方案数-有一列不满足的方案数,我们先枚举一个\(l\)表示当前第\(l\)列选了\(> \lfloor \frac{k}{2} \rfloor\)个
这里要注意,虽然每一行只能选一个数这个限定条件很小,但我们这里因为不好记录哪一些行被选/不选,换言之记录没选的行的严格条件远高于判断某一列选了多少个数的条件,因此我们这里应该往记录选到哪行和列状态来\(dp\)
具体的,我们可以设\(dp_{i,j,k}\)表示前\(i\)行中,第\(l\)列选了\(j\)个,其他列选了\(k\)个的方案数,容易得到递推式:
\[dp_{i,j,k} = dp_{i-1,j,k} + dp_{i-1,j-1,k} \times a_{i,l} + dp_{i-1,j,k-1} \times (sum_{i}-a_{i,l}) \]这个做法总复杂度\(O(mn^3)\),不够优秀
但我们发现我们的\(dp\)递推式中,我们并不在乎\(j,k\)的真实值,我们只在乎\(j-k\)的值
因此我们压缩状态:设\(dp_{i,j}\)表示前\(i\)行中第\(l\)列选的数-其他列选的数的值为\(j\)的方案数
递推式同理,这里不写了
最终复杂度\(O(mn^2)\)
标签:lfloor,frac,列选,我们,rfloor,Emiya,S2019,CSP,dp From: https://www.cnblogs.com/fox-konata/p/17698555.html