312. 戳气球
难度:困难
2020/7/19每日一题打卡
题目描述

解题思路
今天是抄答案而且还抄的迷迷糊糊的一天
知道要这样做,但是仔细去想为什么是这样的,又说不出个所以然

首先在数组左右两端添加虚拟气球节点,是不能被戳破的,这样能方便处理边界,而且保证总是有三个气球相乘。
然后注意动态规划的顺序,要从区间右边开始,逆序,因为前面的要用到后面的子状态
然后k表示最后一个戳破的气球,这样会好理解很多,是最后一个戳破的,左边和右边的结果都有了,直接dp[i][j] = Math.max(dp[i][j], dp[i][k]+dp[k][j]+nums1[i]*nums1[k]*nums1[j]);
/*
* 312. 戳气球
* 2020/7/19每日一题 难度:困难 动态规划
* dp[i][j] : 先戳破[i, k - 1]和[k + 1, j]的气球,最后戳破第k个气球获得转移方程。
*/
public int maxCoins(int[] nums) {
int n = nums.length;
int[] nums1 = new int[n+2];
for (int i = 1; i <= n; i++) {
nums1[i] = nums[i-1];
}
nums1[0] = 1;
nums1[n+1] = 1;
int[][] dp = new int[n+2][n+2];
//开始dp:i为begin,j为end,k为在i、j区间划分子问题时的边界
for (int i = n; i >= 0; i--) {
for (int j = i+2; j < dp.length; j++) {
for (int k = i+1; k < j; k++) {
dp[i][j] = Math.max(dp[i][j], dp[i][k]+dp[k][j]+nums1[i]*nums1[k]*nums1[j]);
}
}
}
return dp[0][n+1];
}

题目描述了戳气球的动态规划问题,难度为困难。在数组两端添加虚拟气球,并从右向左进行动态规划计算,以找到最大乘积。解题过程强调了状态转移方程的理解和应用。
4242

被折叠的 条评论
为什么被折叠?



