LC 0312 [H] Burst Balloons - ALawliet/algorithms GitHub Wiki
https://www.youtube.com/watch?v=VFskby7lUbw&ab_channel=NeetCode
class Solution:
def maxCoins(self, nums: List[int]) -> int:
# special case (all elements in list are same number)
if len(nums) > 1 and len(set(nums)) == 1:
return (nums[0] ** 3) * (len(nums) - 2) + nums[0] ** 2 + nums[0]
# handle edge case
nums = [1] + nums + [1]
@lru_cache(None) # memoization
def dp(left, right):
# maximum if we burst all nums[left]...nums[right], inclusive
if right - left < 0:
return 0
result = 0
# find the last burst one in nums[left]...nums[right]
for i in range(left, right + 1):
# nums[i] is the last burst one
gain = nums[left - 1] * nums[i] * nums[right + 1]
# nums[i] is fixed, recursively call left side and right side
remaining = dp(left, i - 1) + dp(i + 1, right)
# update the result
result = max(result, remaining + gain)
return result
# we can not burst the first one and the last one
# since they are both fake balloons added by ourselves
return dp(1, len(nums) - 2)
class Solution:
def maxCoins(self, nums: List[int]) -> int:
nums = [1] + nums + [1]
dp = {}
def dfs(l, r):
if l > r:
return 0
if (l, r) in dp:
return dp[(l, r)]
dp[(l, r)] = 0
for i in range(l , r + 1):
coins = nums[l - 1] * nums[i] * nums[r + 1]
coins += dfs(l, i - 1) + dfs(i + 1, r)
dp[(l, r)] = max(dp[(l, r)], coins)
return dp[(l, r)]
return dfs(1, len(nums) - 2)
def maxCoins(self, nums):
nums = [1] + nums + [1]
n = len(nums)
dp = [[0] * n for _ in range(n)]
for k in range(2, n):
for L in range(0, n - k):
R = L + k
for i in range(L + 1, R):
dp[L][R] = max(dp[L][R],
nums[L] * nums[i] * nums[R] + dp[L][i] + dp[i][R])
return dp[0][n - 1]