zoukankan      html  css  js  c++  java
  • 戳气球

    戳气球

    题目:
    有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

    现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。

    求所能获得硬币的最大数量。

    说明:

    你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
    0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
    示例:

    输入: [3,1,5,8]
    输出: 167
    解释: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
    coins = 315 + 358 + 138 + 181 = 167

    解题思路:首先思考当只剩一个气球时的硬币数量来自于它自身的价值乘上左边和右边的价值,那么它的左边和右边的价值也是如此求得,之后遍历每一个气球假设其为最后一个戳破的求最大硬币数量

    class Solution {
        public int maxCoins(int[] nums) {
            int len = nums.length;
            if(len == 0)
                return 0;
            
            int arr[] = new int[len + 2];
            arr[0] = 1;
            arr[len + 1] = 1;
            for(int i = 1; i <= len; i++) {
                arr[i] = nums[i - 1];
            }
            
            len = arr.length;
            
            //dp[i][j]表示 从i + 1到j - 1的最大硬币数量
            int dp[][] = new int[len][len];
            
            /**
            状态方程: dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + a[k] * a[i] * a[j])
            **/
            for(int cur = 1; cur <= len; cur++) { 
                //cur代表区间大小
                
                for(int i = 0; i <= len - cur; i++) {
                    int j = i + cur - 1;
                    dp[i][j] = 0;
                    
                    for(int k = i + 1; k <= j - 1; k++) {
                        dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k][j] + arr[i] * arr[k] * arr[j]);
                    }
                }
                
            }
            
            
            return dp[0][len - 1];
        }
    }
    
  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14065780.html
Copyright © 2011-2022 走看看