码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划——Burst Ballons

时间:2018-11-03 12:26:34      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:分数   length   nbsp   ons   div   exp   real   note   5*   

题意:
给定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
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
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]);  这个非常的像矩阵连乘法那个题。
 
 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

标签:分数   length   nbsp   ons   div   exp   real   note   5*   

原文地址:https://www.cnblogs.com/messi2017/p/9900022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!