假镜子。你能帮我解决一下吗?

时间:2011-05-18 16:34:50

标签: algorithm dynamic-programming

以下是problem

  

BFG-9000每次射击都会摧毁三个相邻的阳台。 (第N个阳台毗邻       第一个)。射击后,生存的怪物对列昂尼德造成伤害       (小说的主要英雄) - 每个怪物一个单位。进一步追随新拍摄等       直到所有的怪物       会灭亡需要定义最小的伤害量,       这可以采取狮子座。

例如:

N = 8
A[] = 4 5 6 5 4 5 6 5

answer : 33
4 * * * 4 5 6 5 - 24
4 * * * * * * 5 - 9
* * * * * * * * - 0
你可以帮我解决这个问题吗?复杂性是什么?

2 个答案:

答案 0 :(得分:3)

问题可以通过DP解决。

第一次射击后问题将不再是循环。可以用DP计算攻击后留下的怪物的伤害。让NB是阳台的数量。

D[n,m]n<=m定义m+4<=n,因为阳台bn<=b<=mm<=b<=n上的怪物受损。

If n <= m < n+3 than D[n,m] = sum A[i] for n<=i<=m.
If m >= n+3 than D[n,m] =
   min{ 2*D[n,i-1] + D[i,i+2] + 2*D[i+3,m] } for i in {n,...,m}.
If m < n than D[n,m] =
   min{ 2*D[n,i-1] + D[i,i+2] + 2*D[i+3,m] } for i in {n,...,NB} U {1,...,m}.

结果为min{ D[i+3,NB+i-1] for i in {1,...,NB-2} }

在第三种情况下,结果索引是模NB。

此方法具有复杂性O(n^3)

答案 1 :(得分:1)

看起来问题的限制是这样的,你可以蛮力强迫它。基本上

def go(hit):
    res = 999 
    #base case, check if all items in hit are true.
    for i in range(len(hit)):
        if not hit[i]:
             newhit = [x for x in hit]
             newhit[i] = newhit[i-1] = newhit[(i+1)%len(hit)] = True; 
             damage = 0;
             for j in range(len(hit)):
                  if not newhit[j]:
                     damage+=hit[j]
             res = min(res, go(newhit)+damage)

您还可以将匹配作为位图实现,然后将其记忆以加速该功能。