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

来源:互联网 发布:学python可以做什么 编辑:程序博客网 时间:2024/05/14 23:07

题目传送门
这题属于补坑题,原来交的Pascal……
对于一对骨牌,可以发现要么翻要么不翻,翻转一次对总体差值的影响为2c,其中c为这对骨牌的差值。
证明如下:
不管绝对值问题。设这对骨牌点数分别为xy,与x一行的骨牌(除了x)的点数和为p,与y一行的骨牌(除了y)的点数和为q
原来的差值为x+pyq,交换后为y+pxq
则差值的变化δ=(y+pxq)(x+pyq)=2y2x=2c,证毕。
所以,一对骨牌的翻转对于其他骨牌没有影响,只与自己状态有关,所以转化为01背包问题,背包容量即为骨牌的差值。因为这里差值有正有负,所以将零点定为5n即可。
DP方程式为:

dp[j]=min(dp[j+2ci])+1     j[5n,5n]

初值为
dp[i]={0    i=sum+   isum

其中,sum为初始骨牌点数差的和。
答案为从零点向两边扫到的第一个非最大值的较小值。
时间复杂度O(n2),需要注意枚举顺序(01背包的注意问题了……)
Code

0 0
原创粉丝点击