动态规划解法
class Solution {
public int maxCoins(int[] nums) {
int len = nums.length;
//len + 2的长度是因为需要 -1 和 n + 1位置能得到的硬币为0
//dp[i][j] i--j之间能得到的做多硬币
int[][] dp = new int[len + 2][len + 2];
//book[i] = nums[i - 1] 同时两边为1,代表没有硬币
int[] book = new int[len + 2];
//同时两边为1,代表没有硬币
book[0] = book[len + 1] = 1;
//标记
for(int i = 1; i <= len;i ++) {
book[i] = nums[i - 1];
}
//区间左边界 从后往前
for(int i = len - 1;i >= 0;i--) {
//区间右边界
for(int j = i + 2;j <= len + 1;j++) {
//中间气球 即该区间中最后被扎的气球
for(int k = i + 1;k < j;k++) {
//乘积
int temp = book[i] * book[k] * book[j];
//加上之前被扎的气球
temp += dp[i][k] + dp[k][j];
//取最大值
dp[i][j] = Math.max(dp[i][j], temp);
}
}
}
//【0,len + 1】区间能获得的最多硬币
return dp[0][len + 1];
}
}