以下是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
你可以帮我解决这个问题吗?复杂性是什么?
答案 0 :(得分:3)
问题可以通过DP解决。
第一次射击后问题将不再是循环。可以用DP计算攻击后留下的怪物的伤害。让NB
是阳台的数量。
为D[n,m]
或n<=m
定义m+4<=n
,因为阳台b
,n<=b<=m
或m<=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)
您还可以将匹配作为位图实现,然后将其记忆以加速该功能。