P7154 [USACO20DEC] Sleeping Cows P

原题

我们先思考如果没有极大匹配这个限制该怎么做

ysx曾经说过:dp要先考虑递推顺序

看到这个题的限制siti,可以想到这题要先按照siti的顺序排序

不妨设dpi,j表示考虑了前i个奶牛和前j个牛棚的方案书,容易得到dpi,j=dpi1,j+dpi1,j1

然后我们考虑如果加上了极大匹配的性质要怎么做

我们发现对于一个牛棚ti,他能和所有siti的奶牛进行匹配(废话)

所以我们就可以发现对于一个牛棚,他不被匹配上的条件是不存在任何一个为被匹配的奶牛si满足siti

也说明如果对于某一个奶牛si被钦定为不匹配,那在之后的所有牛棚都必须找一个能与之匹配的奶牛与之匹配(也就是说在这之后的牛棚不能不匹配)

因此我们可以把siti放在一起排序,假定所有奶牛和牛棚无相等的大小关系

不妨设dpi,j,k表示考虑所有i的奶牛和牛棚,其中有j个未被分配的奶牛和k个被钦定为不再匹配的奶牛的方案数

  1. 如果当前是牛棚,可以得到

(1)dpi,j,0=dpi1,j,0+(j+1)×dpi1,j+1,0(2)dpi,j,k=(jk+1)×dpi1,j+1,k (k0)

  1. 如果当前是奶牛,可以得到

(3)dpi,j,0=dpi1,j1,0(4)dpi,j,k=dpi1,j1,k1+dpi1,j1,k

可以发现我们并不在乎当前有多少奶牛被钦定为不匹配,而只在乎是否存在被钦定为不匹配的奶牛

因此第三维可以被压成状态0/1,并定义j为有j想要被分配而未被分配的奶牛,换言之被钦定为不分配的不算在j

可以得到dp柿子:

  1. 如果当前是牛棚,可以得到

(5)dpi,j,0=dpi1,j,0+(j+1)×dpi1,j+1,0(6)dpi,j,k=(j+1)×dpi1,j+1,1

  1. 如果当前是奶牛,可以得到

(7)dpi,j,0=dpi1,j1,0(8)dpi,j,1=dpi1,j,0+dpi1,j,1+dpi1,j1,1

最后原题会卡空间,所以只需要加上一个滚动数组优化即可

最终复杂度O(n2)

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