有一种方法可以把这个问题简化为一个简单的子问题。
解释分为两部分,算法和算法的原因
提供最优解决方案。没有第二个,第一个就说不通了,所以我
从为什么开始。
如果你想轰炸矩形(假设一个大矩形-还没有边缘情况)
你可以看到,只有这样才能减少空心矩形上的正方形
周长到0的意思是炸毁周长或者炸毁的空心矩形
就在外围的方块里。我称周长为图层1,其中的矩形为图层2。
一个重要的观点是,没有点轰炸层1,因为
你这样做得到的“爆炸半径”总是包含在爆炸半径内
另一个来自第2层的正方形。你应该很容易就能说服自己。
所以,我们可以把问题简化为找到一个最优的方法来炸开周长,然后我们可以重复这个过程,直到所有的平方都为0。
但当然了,如果有爆炸的可能,并不总能找到最优解
以一种不太理想的方式远离周边,但通过使用X个额外的炸弹制造
用>X炸弹减少内层的问题。如果我们调用
第一层,如果我们在第二层的某个地方放置一个额外的X炸弹(只是
在第1层内,我们可以减少之后轰炸第2层的努力吗
X ?换句话说,我们必须证明我们可以贪心化简外部
周长。
但是,我们知道我们可以贪婪。因为第2层的炸弹永远不会更多
有效减少第2层到0比战略上放置炸弹在第3层。和
因为和之前一样的原因-总有一个炸弹我们可以放在第3层
将影响第2层的每一个方块,炸弹放在第2层可以。所以,它可以
永远不要伤害我们的贪婪(在这个意义上的贪婪)。
所以,我们要做的就是找到最优的方法,通过轰炸将许可值降为0
下一个内层。
我们永远不会因为先把角落炸到0而受伤,因为只有内层的角落可以到达,所以我们真的没有选择(并且,任何可以到达角落的周长炸弹的爆炸半径都包含在内层角落的爆炸半径中)。
一旦我们这样做了,与0角相邻的周长上的正方形只能由内层的2个正方形到达:
0 A B
C X Y
D Z
在这一点上,周长实际上是一个封闭的1维环,因为任何炸弹都会减少3个相邻的正方形。除了角落附近的一些奇怪之处——X可以“击中”A、B、C和D。
Now we can't use any blast radius tricks - the situation of each square is symmetric, except for the weird corners, and even there no blast radius is a subset of another. Note that if this were a line (as Colonel Panic discusses) instead of a closed loop the solution is trivial. The end points must be reduced to 0, and it never harms you to bomb the points adjacent to the end points, again because the blast radius is a superset. Once you have made your endpoint 0, you still have a new endpoint, so repeat (until the line is all 0).
所以,如果我们可以优化地将层中的单个正方形减少到0,我们就有了一个算法(因为我们已经切断了循环,现在有了一条带有端点的直线)。我相信轰炸与最小值相邻的正方形(给你2个选项),这样在最小值的2个正方形内的最大值就是最小值(你可能不得不分割你的轰炸来管理这一点)将是最优的,但我还没有证明。