博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Burst Balloons
阅读量:5369 次
发布时间:2019-06-15

本文共 3047 字,大约阅读时间需要 10 分钟。

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will getnums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.

Find the maximum coins you can collect by bursting the balloons wisely.

- You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
- 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

Example

Given [4, 1, 5, 10]

Return 270

nums = [4, 1, 5, 10] burst 1, get coins 4 * 1 * 5 = 20nums = [4, 5, 10]    burst 5, get coins 4 * 5 * 10 = 200 nums = [4, 10]       burst 4, get coins 1 * 4 * 10 = 40nums = [10]          burst 10, get coins 1 * 10 * 1 = 10Total coins 20 + 200 + 40 + 10 = 270 递归做法:
1 public class Solution { 2   public int maxCoins(int[] nums) { 3       if (nums == null || nums.length == 0) return 0; 4       List
list = new LinkedList<>(); 5 for (int index = 0; index < nums.length; index++) { 6 list.add(nums[index]); 7 } 8 return helper(list); 9 }10 11 public int helper(List
list) {12 if (list.size() == 1) return list.get(0);13 int max = 0;14 for (int i = 0; i < list.size(); i++) {15 int value = getValue(list, i) * getValue(list, i - 1) * getValue(list, i + 1);16 List
temp = new LinkedList<>(list);17 temp.remove(i);18 max = Math.max(max, value + helper(temp));19 }20 return max;21 }22 23 private int getValue(List
list, int index) {24 if (index < 0 || index >= list.size()) {25 return 1;26 } 27 return list.get(index);28 }29 }

方法二:

既然递归通不过,只能用DP,关键是那个递归式怎么写啊?

在从1到n个气球里,哪个会是最后一个呢?你不知道吧?我也不知道。所以我们得从头到尾假设第k个球是最后一个球。如果第k个球是最后一个球,会有什么性质呢?我们可以保证一定第k个球左边和右边的球永远不会靠在一起,换句话说,我们可以得到下面的递推式:

dp[i][j] = max(dp[i][j], nums[i - 1]*nums[k]*nums[j + 1] + dp[i][k - 1] + dp[k + 1][j]) ( i ≤ k ≤ j )
1 public class Solution { 2     public int maxCoins(int[] nums) { 3         if (nums == null || nums.length == 0) return 0; 4  5         List
list = new ArrayList<>(); 6 list.add(1); 7 for (int index = 0; index < nums.length; index++) { 8 list.add(nums[index]); 9 }10 list.add(1);11 12 int[][] dp = new int[list.size()][list.size()];13 int n = nums.length;14 for (int step = 0; step <= n - 1; step++) {15 for (int i = 1; i <= n - step; i++) {16 int j = i + step;17 for (int k = i; k <= j; k++) {18 dp[i][j] = Math.max(dp[i][j],19 list.get(i - 1) * list.get(k) * list.get(j + 1) + dp[i][k - 1] + dp[k + 1][j]);20 }21 }22 }23 return dp[1][n];24 }25 }

  

转载于:https://www.cnblogs.com/beiyeqingteng/p/5700023.html

你可能感兴趣的文章
JavaScript 技巧与高级特性
查看>>
Uva 11729 Commando War
查看>>
增强学习(一) ----- 基本概念
查看>>
ubuntu下USB连接Android手机
查看>>
C# 语句 分支语句 switch----case----.
查看>>
反射获取 obj类 的属性 与对应值
查看>>
表单中的readonly与disable的区别(zhuan)
查看>>
win10下安装配置mysql-8.0.13--实战可用
查看>>
周记2018.8.27~9.2
查看>>
MySQL中 1305-FUNCTION liangshanhero2.getdate does not exit 问题解决
查看>>
python序列化和json
查看>>
mongodb
查看>>
网格与无网格
查看>>
SSH-struts2的异常处理
查看>>
《30天自制操作系统》学习笔记--第14天
查看>>
LGPL协议的理解
查看>>
1、Python基础
查看>>
Unity The Tag Attribute Matching Rule
查看>>
试着理解下kvm
查看>>
WebService学习总结(二)--使用JDK开发WebService
查看>>