class Solution:
def maxCoins(self, nums: List[int]) -> int:
# DP 因为dp[left][right] = argmax(dp[left][i]+dp[i][right]+left*i*right)
# 这个遍历顺序就是,先中间,后两边 所以将left,right都指向最右,然后开始遍历
l = len(nums)
vals = [1]+nums+[1]
# 注意初始化的意义是 在没有操作以前最大值为0
dp = [[0]*(l+2) for _ in range(l+2)]
# left right都是不取得,所以为了使得left,right中间有值, right至少=left+2
# 1 3158 1 left 从5开始 right从1开始 k=[8]
for left in range(l-1,-1,-1):
for right in range(left+2,l+2):
for k in range(left+1,right):
dp[left][right] = max(dp[left][right], dp[left][k]+dp[k][right]+vals[left]*vals[right]*vals[k])
return dp[0][-1]
# 记忆化搜索,固定left 和 right, 遍历搜索 left*i*right+search(left,i)+search(i,right) 最大时的i值
# 然后再固定 left,i; i,right
# 超时
# @lru_cache(None)
# def search_all(left,right):
# if left >= right-1: # left = 3 right = 4
# return 0
# res = 0
# for num in range(left+1,right):
# total = vals[left]*vals[num]*vals[right] + search_all(left,num)+search_all(num,right)
# res = max(res,total)
# # print(res,maxNum)
# return res
# vals = [1]+nums+[1]
# return search_all(0,len(nums)+1)
https://leetcode-cn.com/problems/burst-balloons/