文章目录
P2704 [NOI2001] 炮兵阵地
题目链接
参考题解
因为列数仅为10,考虑使用状态压缩,用一个数字
s
s
s表示某行的炮兵放置情况,当
s
s
s二进制的
k
k
k位为1,该行的
k
k
k列就放置了炮兵。
预处理: 因为要计算炮兵的数量,先计算每个状态
s
s
s的炮兵个数(即二进制中
1
1
1的数量)
s
u
m
[
s
]
sum[s]
sum[s]。
状态设计:
d
p
[
i
]
[
s
1
]
[
s
2
]
dp[i][s1][s2]
dp[i][s1][s2]表示前
i
i
i行已经安排好,第
i
−
1
i-1
i−1行的状态为
s
1
s1
s1,第
i
i
i行的状态为
s
1
s1
s1,可以放置的最多炮兵数量。起始状态是第一行所有合法状态。
状态转移: 其实状态转移比较简单,比较冗杂的是状态转移的判断。分三种情况:避免当前行的炮兵放置在山地上;避免当前行的炮兵相互攻击;如果有上一行(上上行),需要避免当前行和上一行(上上行)的炮兵相互攻击。如果都合法就增加当前行安排的状态的炮兵数量。
空间优化: 需要安排好前 i − 1 i-1 i−1行才能开始安排第 i i i行,也就是说第 i i i行的状态只和前 i − 1 i-1 i−1行有关,因此保存第前一行和当前行的状态就够了。