dp[r][l][b][i] = 你可以通过访问 r 作为最右边的粉丝,l 作为最左边的粉丝,b 是一个布尔值,表示你是否在最右边的粉丝的位置或左, i 是剩余的效用。可能的状态数量为 100 * 100 * 2 * 10000 = 200000000,应该可以在一秒钟内解决。
伪代码:将粉丝分成 2 个:0 的。
solve(left, right, atRight, utility):
if left < 0 or right > totalFans or utility <= 0:
return 0
if dp[left][right][atRight][utility] != None:
return dp[left][right][atRight][utility]
if atRight == true:
dp[left][right][atRight][utility] = max(solve(left, right + 1, true, utility - distance(right, right + 1)), solve(left + 1, right, false, utility - distance(right, left + 1))) + utility
else:
dp[left][right][atRight][utility] = max(solve(left + 1, right, false, utility - distance(left, left + 1)), solve(left, right + 1, true, utility - distance(right + 1, left))) + utility
return dp[left][right][atRight][utility]
answer = max(solve(0, 1, true, initialUtility - distance(0, firstFan at dist > 0)), solve(1, 0, false, initialUtility - distance(0, firstFan at dist < 0)))
你基本上尝试了所有的可能性,你的状态是你所在的位置,你已经拥抱的最右边的粉丝,你已经拥抱的最左边的粉丝和剩下的效用。如果最左边的粉丝是 10,这意味着你已经拥抱了最接近 0 的粉丝,即在 pos