package com.fishercoder.solutions;

/**
 * 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)
 Note: The number of boxes n would not exceed 100.
 */
public class _546 {
    /**credit: https://leetcode.com/articles/remove-boxes/#approach-2-using-dp-with-memorizationaccepted*/
    public int removeBoxes(int[] boxes) {
        int[][][] dp = new int[100][100][100];
        return calculatePoints(boxes, dp, 0, boxes.length - 1, 0);
    }

    public int calculatePoints(int[] boxes, int[][][] dp, int l, int r, int k) {
        if (l > r) return 0;
        if (dp[l][r][k] != 0) return dp[l][r][k];
        while (r > l && boxes[r] == boxes[r - 1]) {
            r--;
            k++;
        }
        dp[l][r][k] = calculatePoints(boxes, dp, l, r - 1, 0) + (k + 1) * (k + 1);
        for (int i = l; i < r; i++) {
            if (boxes[i] == boxes[r]) {
                dp[l][r][k] = Math.max(dp[l][r][k], calculatePoints(boxes, dp, l, i, k + 1) + calculatePoints(boxes, dp, i + 1, r - 1, 0));
            }
        }
        return dp[l][r][k];
    }
}

@@ -145,16 +145,18 @@
 umbers.%0A
+ *
  You may
@@ -226,16 +226,18 @@
 x left.%0A
+ *
  Each ti
@@ -359,16 +359,18 @@
 points.%0A
+ *
  Find th
@@ -695,12 +695,14 @@
 00.%0A
+%0A
  */%0A
+%0A
 publ
@@ -724,16 +724,24 @@
 %0A    /**
+%0A     * 
 credit: 
@@ -829,16 +829,345 @@
 accepted
+%0A     *%0A     * For an entry in dp%5Bl%5D%5Br%5D%5Bk%5D, l represents the starting index of the subarray,%0A     * r represents the ending index of the subarray%0A     * and k represents the number of elements similar to the r%E2%80%8Bth element%0A     * following it which can be combined to obtain the point information to be stored in dp%5Bl%5D%5Br%5D%5Bk%5D.%0A     
 */%0A    p
@@ -1428,17 +1428,41 @@
  r) 
-return 0;
+%7B%0A            return 0;%0A        %7D
 %0A   
@@ -1487,16 +1487,30 @@
 k%5D != 0)
+ %7B%0A           
  return 
@@ -1518,24 +1518,34 @@
 p%5Bl%5D%5Br%5D%5Bk%5D;%0A
+        %7D%0A
         whil
@@ -1785,24 +1785,24 @@
 boxes%5Br%5D) %7B%0A
-
             
@@ -1840,16 +1840,40 @@
 %5D%5Br%5D%5Bk%5D,
+%0A                       
  calcula

refactor 546