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)
  • 相关阅读:
    Nhibernate对象转JSON
    C# Windows服务
    C# 接收http请求
    C# XML 基础解系
    C# XML 序列化与反序列化
    C# Newtonsoft.Json 应用
    C# 读取自定义XML
    对图片添加水印
    iText: 对pdf文件添加水印
    java对Office文件处理技术(介绍)
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10492800.html
Copyright © 2011-2022 走看看