题目传送门
这题属于补坑题,原来交的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+p−y−q,交换后为
y
+
p
−
x
−
q
y+p-x-q
y+p−x−q。
则差值的变化
δ
=
(
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+p−x−q)−(x+p−y−q)=2y−2x=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
[背包DP] [Luogu P1282] 多米诺骨牌
最新推荐文章于 2022-04-08 21:00:30 发布