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)
  • 相关阅读:
    一个获取电脑MAC地址的方法
    一个扑克牌洗牌的实例代码
    猴子分桃问题——一个简单的递归
    浅谈单元测试
    数值统计 AC 杭电
    平方和与立方和 AC 杭电
    求奇数的乘积 AC 杭电
    第几天 switch做法 杭电
    第几天 AC 杭电
    成绩转换 AC 杭电
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10492800.html
Copyright © 2011-2022 走看看