动态规划——Burst Ballons
Posted messi2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——Burst Ballons相关的知识,希望对你有一定的参考价值。
题意:
给定n个气球。每次你可以打破一个,打破第i个,那么你会获得nums[left] * nums[i] * nums[right]个积分。 (nums[-1] = nums[n] = 1)求你可以获得的最大积分数。
给定n个气球。每次你可以打破一个,打破第i个,那么你会获得nums[left] * nums[i] * nums[right]个积分。 (nums[-1] = nums[n] = 1)求你可以获得的最大积分数。
Note:
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
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:
Input: [3,1,5,8]
Output: 167
Explanation: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167
Input: [3,1,5,8]
Output: 167
Explanation: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167
dp[i][j]为打破的气球为i~j之间。
我们可以想象:最后的剩下一个气球为i的时候,可以获得的分数为:nums[-1]*nums[i]*nums[n].
那么介于i,j之间的x,有: dp[i][j] = max(dp[i][j], dp[i][x – 1] + nums[i – 1] * nums[x] * nums[j + 1] + dp[x + 1][j]); 这个非常的像矩阵连乘法那个题。
我们可以想象:最后的剩下一个气球为i的时候,可以获得的分数为:nums[-1]*nums[i]*nums[n].
那么介于i,j之间的x,有: dp[i][j] = max(dp[i][j], dp[i][x – 1] + nums[i – 1] * nums[x] * nums[j + 1] + dp[x + 1][j]); 这个非常的像矩阵连乘法那个题。
1 public int maxCoins(int[] nums) { 2 int len = nums.length; 3 int[]num = new int[len+2]; 4 int[][]dp = new int[len+2][len+2]; 5 for(int i = 0;i<=len+1;i++) 6 if(i==0||i==len+1)num[i] = 1; 7 else num[i] = nums[i-1]; 8 int j = 0,temp = 0; 9 for(int k = 1;k<=len;k++) { 10 for(int i = 1;i<=len-k+1;i++) { 11 j = i+k-1; 12 for(int x = i;x<=j;x++) { 13 temp = dp[i][x-1]+num[i-1]*num[x]*num[j+1]+dp[x+1][j]; 14 dp[i][j] = dp[i][j]>temp?dp[i][j]:temp; 15 } 16 } 17 } 18 return dp[1][len]; 19 }
以上是关于动态规划——Burst Ballons的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 312. Burst Balloons 戳气球(困难)
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++