zoukankan      html  css  js  c++  java
  • 312. Burst Balloons

    Question

    https://leetcode.com/problems/burst-balloons/description/

    Solution

    题目大意是,有4个气球,每个气球上有个数字,现在依次打这4个气球(可以看成两边还各有一个气球即1,3,1,5,8,1),第一次打5这处气球,你的得分是左边气球上的数乘右边气球上的数再乘被打气球上的数。按任意顺序打这4个气球,求最终得分最高的值。

    思考:正向思考

    反向思考:

    public int maxCoins(int[] nums) {
        // 假设输入是[3,1,5,8]
    
        // 构造一个新的气球数组[1,3,1,5,8,1]
        int[] fullNums = new int[nums.length + 2];
        fullNums[0] = 1;
        fullNums[fullNums.length - 1] = 1;
        for (int i = 1; i < fullNums.length - 1; i++) fullNums[i] = nums[i - 1];
    
        // 存储从a气球到b气球的最高得分,初始化为-1,由于b>=a所以存储一半就可以了
        int[][] result = new int[fullNums.length][fullNums.length];
        for (int i = 1; i < result.length; i++) {
            for (int j = i; j < result[0].length; j++) {
                result[i][j] = -1;
            }
        }
    
        // 相对于构造的数组 从1到4号气球才是我们要打的气球
        return getMax(fullNums, result, 1, fullNums.length - 2);
    }
    
    private int getMax(int[] fullNums, int[][] result, int begin, int end) {
        if (begin > end) return 0;
    
        // 如果不是初始值,说明已经计算过该值了,直接返回结果
        if (result[begin][end] != -1) return result[begin][end];
    
        // 最后结果有4种,最后打3或1或5或8这四种可能,比较取最大值
        for (int pos = begin; pos <= end; pos++) {
            int left = getMax(fullNums, result, begin, pos - 1);
            int mid = fullNums[begin - 1] * fullNums[pos] * fullNums[end + 1];
            int right = getMax(fullNums, result, pos + 1, end);
            int coin = left + mid + right;
            if (coin > result[begin][end]) result[begin][end] = coin;
        }
        return result[begin][end];
    }
    

    Reference

  • 相关阅读:
    java中compareTo()用法详解
    random详解
    http协议介绍
    各种Web渗透测试平台
    提升黑客技能的十大网站
    .htaccess文件得用途
    XSS平台搭建
    session攻击(会话劫持+固定)与防御
    伪静态的原理以及应用
    Nessus激活码获取
  • 原文地址:https://www.cnblogs.com/okokabcd/p/9169091.html
Copyright © 2011-2022 走看看