波利克拉普想杀死一队弓箭手,他唯一的武器是一个火球。如果polycarp用他的火球击中第i个弓箭手(从左到右编号),弓箭手将失去一个生命点。
同时,该咒语会伤害第i-th附近的弓箭手(如果有的话)-他们每人失去b(1 ≤ b 由于极限弓箭手(即编号为1和n的弓箭手)距离很远,火球无法到达他们波利卡普可以用他的火球击中任何其他弓箭手。
每个弓箭手的生命点数是已知的当这个数量小于0时,弓箭手将被杀死polycarp可以用来杀死所有敌人的最小法术数量是多少?
如果弓箭手已经死了,波利卡普可以把他的火球扔到弓箭手身上。
I/O说明

INPUT -The first line of the input contains three integers n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10).
       The second line contains a sequence of n integers — h1, h2, ..., hn (1 ≤ hi ≤ 15), where hi is the amount of health points the i-th archer has.

OUTPUT- In the first line print t — the required minimum amount of fire balls.
        In the second line print t numbers — indexes of the archers that Polycarp should hit to kill all the archers in t shots.

现在我已经编写了一个递归函数,它获取射箭者当前的生命值数组,并生成每个可能的攻击,直到所有射箭者死亡并返回最小值。
但是这种方法太慢了,怎么能有效地解决呢?
注意:我不一定对优化我自己的解决方案感兴趣,但对其他可能更快的解决方案持开放态度。
Problem Link with some test cases
My current solution

最佳答案

关键是要杀死最左的弓箭手,你需要通过火球要么在他或在他旁边的弓箭手。
杀死第1和第n弓箭手。
从左边开始。你可以向最左边的弓箭手或他右边的同伴投掷火球来杀死他排列数组DP,它将有像弓箭手的数量左边和生命点最左边的三个条目(生命点为其他在广告中)所以,尝试两种可能性之一,检查您是否已经处于这种情况下,如果是,请使用DP中的应答,如果不是递归向下,则展开递归在递归的每个级别上向数组DP中添加数据。

关于algorithm - 杀死每个弓箭手所需的火球数量最少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39445589/

10-11 23:15