解题思路
核心思想:
由于戳气球的操作会导致两个气球从不相邻变成相邻,使得后续操作难以处理。于是我们倒过来看这些操作,将全过程看成每次添加一个气球。
solve(i, j)表示 开区间(i, j) 所能获得的最大硬币数。当开区间只包含一个气球mid时,solve(i, j) = val[i] * val[mid] * val[j]
记忆化搜索
自顶向下分治+递归+记忆
/*
解法一: 记忆化搜索
由于戳气球的操作会导致两个气球从不相邻变成相邻,使得后续操作难以处理。
于是我们倒过来看这些操作,将全过程看成每次添加一个气球。
*/
func maxCoins(nums []int) int {
n := len(nums)
/*
初始化val切片,左右边界都视为值为1的气球
*/
val := make([]int, n+2)
val[0], val[n+1] = 1, 1
for i := 1; i < n+1; i++ {
val[i] = nums[i-1]
}
/*
初始化结果数组,res[i][j]表示开区间(i, j)
所能获取的最大硬币数
*/
res := make([][]