zoukankan      html  css  js  c++  java
  • 546. Remove Boxes

    Given several boxes with different colors represented by different positive numbers. 
    You may experience several rounds to remove boxes until there is no box left. Each time you can choose some continuous boxes with the same color (composed of k boxes, k >= 1), remove them and get k*k points.
    Find the maximum points you can get.

    Example 1:
    Input:

    [1, 3, 2, 2, 2, 3, 4, 3, 1]
    

    Output:

    23
    

    Explanation:

    [1, 3, 2, 2, 2, 3, 4, 3, 1] 
    ----> [1, 3, 3, 4, 3, 1] (3*3=9 points) 
    ----> [1, 3, 3, 3, 1] (1*1=1 points) 
    ----> [1, 1] (3*3=9 points) 
    ----> [] (2*2=4 points)

    Approach #1: three dimensional DP. [C++] [Hard]

    class Solution {
    public:
        int removeBoxes(vector<int>& boxes) {
            int n = boxes.size();
            m_ = vector<vector<vector<int>>>(n, vector<vector<int>>(n, vector<int>(n, 0)));
            return dfs(boxes, 0, n-1, 0);
        }
        
    private:
        vector<vector<vector<int>>> m_;
        
        int dfs(const vector<int>& boxes, int l, int r, int k) {
            if (l > r) return 0;
            if (m_[l][r][k] != 0) return m_[l][r][k];
            while (l < r && boxes[r-1] == boxes[r]) {--r; ++k;}
            m_[l][r][k] = dfs(boxes, l, r-1, 0) + (k + 1) * (k + 1);
            for (int i = l; i < r; ++i) {
                if (boxes[i] == boxes[r])
                    m_[l][r][k] = max(m_[l][r][k], dfs(boxes, l, i, k + 1) + dfs(boxes, i + 1, r - 1, 0));
            }
            return m_[l][r][k];
        }
    };
    

      

    Analysis:

    dp[i][j][k] = max score of subarray b[i] ~ b[j] if there are k boxes that have the same color as b[j] following b[j]. Those k boxes are from box[j+1] ~ box[n], to simulate boxes with other colors are removed first.

    Transition:

    dp[i][j][k] = dp[i][j-1][0] + (k + 1)^2    # case 1

           dp[i][p][k+1] + dp[p+1][j-1][0]  # case 2

    Case 1: drop box[j], remove k + 1 boxes.

    Case 2: Try all breakpoints p, attach a[j] to a[p], i <= p < j, box[p] == box[j].

    Ans:

    dp[0][n-1][0]

    Tim complexity: O(n^4) Space complexity: O(n^3)

    Reference:

    https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-546-remove-boxes/

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    struts.xml配置详解 内部资料 请勿转载 谢谢合作
    Struts框架2ActionError类 内部资料 请勿转载 谢谢合作
    Struts框架 内部资料 请勿转载 谢谢合作
    JDBC 内部资料 请勿转载 谢谢合作
    JSP 实现◆菱形 三角形△ 的输出
    JSP实现 乘法口诀输出
    GUID 全局统一标识符的介绍
    Java 基础 Map 练习题
    Java 异常处理 练习2
    Java 异常处理
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10492800.html
Copyright © 2011-2022 走看看