P5664 [CSP-S2019] Emiya 家今天的饭

原题

之前做过,后来忘了,回顾&复习

首先这题容易想到是容斥,因为保证所有他要求每种主要食材至多在k2道菜中被使用(注意,这里是主要食材,不是菜的个数,别问我为什么强调这个),这说明不满足这个条件的情况最多只有一列会出现>k2的情况

因此我们可以先求出任意选的方案数-有一列不满足的方案数,我们先枚举一个l表示当前第l列选了>k2

这里要注意,虽然每一行只能选一个数这个限定条件很小,但我们这里因为不好记录哪一些行被选/不选,换言之记录没选的行的严格条件远高于判断某一列选了多少个数的条件,因此我们这里应该往记录选到哪行和列状态dp

具体的,我们可以设dpi,j,k表示前i行中,第l列选了j个,其他列选了k个的方案数,容易得到递推式:

dpi,j,k=dpi1,j,k+dpi1,j1,k×ai,l+dpi1,j,k1×(sumiai,l)

这个做法总复杂度O(mn3),不够优秀

但我们发现我们的dp递推式中,我们并不在乎j,k的真实值,我们只在乎jk的值

因此我们压缩状态:设dpi,j表示前i行中第l列选的数-其他列选的数的值为j的方案数

递推式同理,这里不写了

最终复杂度O(mn2)

posted @   FOX_konata  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示