classSolution:defmaximumBobPoints(self, numArrows:int, aliceArrows: List[int])-> List[int]:
ans =[0]*12
_max =0for mask inrange(1<<12):
score =0
cost =0
flag =True
cur =[0]*12for i inrange(12):if(1<< i)& mask:
cost += aliceArrows[i]+1if cost > numArrows:
flag =Falsebreak
score += i
cur[i]= aliceArrows[i]+1if flag:if score > _max:
_max = score
ans = cur[::]
yu = numArrows -sum(ans)
ans[0]+= yu
return ans
没有写出的搜索(代码@灵剑2012):
classSolution:defmaximumBobPoints(self, numArrows:int, aliceArrows: List[int])-> List[int]:
ans =0
plan =[0]*10defsearch(i, arrows, current, current_plan):nonlocal ans, plan
# 确定了i个位置的方案了if i ==len(aliceArrows):if current > ans:
ans = current
plan = current_plan[:]return# 第i个位置可以赢的情况if aliceArrows[i]+1<= arrows:
current_plan.append(aliceArrows[i]+1)
search(i +1, arrows -
aliceArrows[i]-1, current + i, current_plan)
current_plan.pop()# 不赢的情况
current_plan.append(0)
search(i +1, arrows, current, current_plan)# 列表是直接传递的本身,所以要回退# 因为0的返回有可能回溯到前面是1的情况,必须pop出后面所有的0才是当前状态!
current_plan.pop()
search(1, numArrows,0,[])return[numArrows -sum(plan)]+ plan