[背包DP] [Luogu P1282] 多米诺骨牌

题目传送门
这题属于补坑题,原来交的Pascal…
对于一对骨牌,可以发现要么翻要么不翻,翻转一次对总体差值的影响为 2 c 2c 2c,其中 c c c为这对骨牌的差值。
证明如下:
不管绝对值问题。设这对骨牌点数分别为 x x x y y y,与 x x x一行的骨牌(除了 x x x)的点数和为 p p p,与 y y y一行的骨牌(除了 y y y)的点数和为 q q q
原来的差值为 x + p − y − q x+p-y-q x+pyq,交换后为 y + p − x − q y+p-x-q y+pxq
则差值的变化 δ = ( y + p − x − q ) − ( x + p − y − q ) = 2 y − 2 x = 2 c \delta=(y+p-x-q)-(x+p-y-q)=2y-2x=2c δ=(y+pxq)(x+pyq)=2y2x=2c,证毕。
所以,一对骨牌的翻转对于其他骨牌没有影响,只与自己状态有关,所以转化为01背包问题,背包容量即为骨牌的差值。因为这里差值有正有负,所以将零点定为 5 n 5n 5n即可。
DP方程式为:
d p [ j ] = min ⁡ ( d p [ j + 2 c i ] ) + 1       j ∈ [ − 5 n , 5 n ] dp[j]=\min(dp[j+2c_i])+1\ \ \ \ \ j\in [-5n,5n] dp[j]=min(dp[j+2ci])+1     j[5n,5n]
初值为
d p [ i ] = { 0      i = s u m + ∞     i ≠ s u m dp[i]= \begin{cases} 0\ \ \ \ i=sum\\ +\infty \ \ \ i \not= sum \end{cases} dp[i]={0    i=sum+   i=sum
其中, s u m sum sum为初始骨牌点数差的和。
答案为从零点向两边扫到的第一个非最大值的较小值。
时间复杂度 O ( n 2 ) O(n^2) O(n2),需要注意枚举顺序(01背包的注意问题了…)
Code

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值