解法一:记忆化搜索

参考官方题解:https://leetcode-cn.com/problems/remove-boxes/solution/yi-chu-he-zi-by-leetcode-solution/
太顶了😱

  1. class Solution {
  2. public int removeBoxes(int[] boxes) {
  3. final int n = boxes.length;
  4. int[][][] dp = new int[n][n][n];
  5. return f(dp, boxes, 0, boxes.length - 1, 0);
  6. }
  7. private int f(int[][][] dp, final int[] boxes, int l, int r, int k) {
  8. if (l > r) {
  9. return 0;
  10. }
  11. if (dp[l][r][k] != 0) {
  12. return dp[l][r][k];
  13. }
  14. for (; (r > l) && (boxes[r] == boxes[r - 1]); --r, ++k) ;
  15. dp[l][r][k] = f(dp, boxes, l, r - 1, 0) + (k + 1) * (k + 1);
  16. for (int i = l; i < r; ++i) {
  17. if (boxes[i] == boxes[r]) {
  18. dp[l][r][k] = Math.max(dp[l][r][k], f(dp, boxes, l, i, k + 1) + f(dp, boxes, i + 1, r - 1, 0));
  19. }
  20. }
  21. return dp[l][r][k];
  22. }
  23. }