LeetCode 312. Burst Balloons
来源:互联网 发布:专业动漫制作软件 编辑:程序博客网 时间:2024/05/18 05:02
题目
312. Burst Balloons
思路
考虑最后一个戳破的气球,这个气球的位置可以把整个气球数组分成两部分。
注意是最后一个,不是第一个,之前一直没转过弯来。
利用动态规划思路:
动态规划数组: DP[k][h]:nums[k...h]能戳破气球的最大值递推关系: 取k<m<h,nums[m]假设是最后一个戳破的气球 则DP[k][h] = for (m = k+1...h) max(DP[k][m] + DP[m][h] + nums[k] * nums[m] * nums[h]);初始值: 需要扩展nums,数组长+2,头和尾分别加入1 DP[k][h]: 当k + 1 = h 或 k = h时,为0; 当k + 2 = h 时,为 nums[k] * nums[k+1] * nums[k+2];
代码
public int maxCoins(int[] nums) { //DP: the result depends on the last burst balloon, which seprate the array into 2 subarray. //DP: by adding 1 to head and tail, DP[i,i] = 0 and DP[i,i+2] = num[i] * num[i+1] * num[i+2] int n = nums.length+2; int[] newnums = new int[n]; for (int i = 0;i < n - 2; i++){ newnums[i+1] = nums[i]; } newnums[0] = newnums[n - 1] = 1; int[][] DP = new int[n][n]; for (int k = 2; k < n; k++){ for (int l = 0; l + k < n; l++){ int h = l + k; for (int m = l + 1; m < h; m++){ DP[l][h] = Math.max(DP[l][h],newnums[l] * newnums[m] * newnums[h] + DP[l][m] + DP[m][h]); } } } return DP[0][n - 1];}
附上递归版,回溯法代码(果断超时):
public int maxR(int [] nums) { if (0 == nums.length) { return 0; } else if (1 == nums.length) { return nums[0]; } else { int max = Integer.MIN_VALUE; int [] newNum = new int [nums.length - 1]; for (int i = 0; i < nums.length; i++) { int r = 0; if (i == 0) { System.arraycopy(nums, 1, newNum, 0, nums.length - 1); r = maxR(newNum) + nums[0] * nums[1]; } else if (i == nums.length - 1) { System.arraycopy(nums, 0, newNum, 0, nums.length - 1); r = maxR(newNum) + nums[nums.length - 2] * nums[nums.length - 1]; } else { System.arraycopy(nums, 0, newNum, 0, i); System.arraycopy(nums, i + 1, newNum, i, nums.length - i - 1); r = maxR(newNum) + nums[i - 1] * nums[i] * nums[i + 1]; } if (max < r) max = r; } return max; }}public int maxCoins(int[] nums) { return maxR(nums);}
其他部分:
package com.leetcode;public class Leetcode312 { public static void main(String[] args) { // TODO Auto-generated method stub Leetcode312 lc = new Leetcode312(); int [] nums = {7,9,8,0,7,1,3,5,5,2,3}; System.out.println(lc.maxCoins(nums)); } ...}
0 0
- leetcode 312. Burst Balloons
- [leetcode] 312. Burst Balloons
- LeetCode 312. Burst Balloons
- LeetCode 312. Burst Balloons
- leetcode.312. Burst Balloons
- 【leetcode】312. Burst Balloons
- LeetCode 312. Burst Balloons
- leetcode 312. Burst Balloons
- leetcode 312.Burst Balloons
- Leetcode-312. Burst Balloons
- 【Leetcode】312. Burst Balloons
- 【leetcode】312. Burst Balloons
- 【leetcode】312. Burst Balloons
- LeetCode 312. Burst Balloons
- 【Leetcode】312. Burst Balloons
- 【LeetCode】312. Burst Balloons
- 【LeetCode】312. Burst Balloons
- leetcode 312. Burst Balloons
- 利用U盘PE系统修复win7系统的启动引导文件
- 开启我的博客之旅吧!
- c++实验2-标准体重
- 自然语言处理(NLP)概念浅析及国内外学习资料盘点
- 十进制转化为二进制
- LeetCode 312. Burst Balloons
- 状态树搜索算法-------------抽象问题与建模思想(三只水桶分水问题)
- github搭建
- leetcode54-Spiral Matrix(打印蛇形矩阵)
- 打印C++中的极大极小数值
- Word2vec发展趋势
- Linux目录结构
- hosting&docker host net & docker nat net apache服务器性能测试
- 2014|2015 华为机考简单题解体报告