题目描述
解题思路
参照🔗
dp[i][j]表示的是在i,j的区间中能获得硬币的最大数量,解释一下dp递推公式
在这个区间,最后一次随意戳爆一个气球,例如戳粉色的,那么其递推公式就为:
dp[i][j] = dp[i][k] + dp[k][j] + val[i] val[k] val[j],为啥是val[i] val[k] val[j]?因为k表示是最后一个删除的气球,所以前面的都被全部删除了。
public int maxCoins(int[] nums) {
int n = nums.length;
int[] newNums = new int[nums.length + 2];
newNums[0] = 1;
newNums[n + 1] = 1;
for (int i = 0; i < n; i++) {
newNums[i + 1] = nums[i];
}
int[][] dp = new int[n + 2][n + 2];
// 表示开区间长度
for (int len = 3; len <= n + 2; len++) {
// 开区间的最左边
for (int i = 0; i <= n + 2 - len; i++) {
int res = 0;
// 中间索引
for (int j = i + 1; j < i + len - 1; j++) {
int left = dp[i][j];
int right = dp[j][i + len - 1];
res = Math.max(res, left + newNums[i] * newNums[j] * newNums[i + len - 1] + right);
}
dp[i][i + len - 1] += res;
}
}
return dp[0][n + 1];
}