参考的题解都已经在代码中注明了。

看这篇题解得到思路:

https://leetcode-cn.com/problems/remove-boxes/solution/guan-fang-fang-fa-2ji-yi-hua-sou-suo-dong-hua-tu-j/

Java 代码:

public class Solution {// 参考:https://leetcode-cn.com/problems/remove-boxes/solution/yi-chu-he-zi-by-leetcode/public int removeBoxes(int[] boxes) {int[][][] memo = new int[100][100][100];int len = boxes.length;return removeBoxes(boxes, memo, 0, len - 1, 0);}private int removeBoxes(int[] boxes, int[][][] memo, int left, int right, int k) {if (left > right) {return 0;}if (memo[left][right][k] != 0) {return memo[left][right][k];}while (left < right && boxes[right] == boxes[right - 1]) {right--;k++;}memo[left][right][k] = removeBoxes(boxes, memo, left, right - 1, 0) + (k + 1) * (k + 1);for (int i = left; i < right; i++) {if (boxes[i] == boxes[right]) {memo[left][right][k] =Math.max(memo[left][right][k],removeBoxes(boxes, memo, left, i, k + 1) + removeBoxes(boxes, memo, i + 1, right - 1, 0));}}return memo[left][right][k];}
}

Java 代码:

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;public class Solution2 {// 参考资料:https://leetcode-cn.com/problems/remove-boxes/solution/yuan-chuang-jie-fa-by-inszva-2/public int removeBoxes(int[] boxes) {int len = boxes.length;Map<Integer, Integer> hashMap = new HashMap<>();int[] next = new int[len];// 赋值为 len 是有含义的Arrays.fill(next, len);// 由于要找右边第 1 个,所以从右边向左边更新for (int i = len - 1; i >= 0; i--) {if (hashMap.containsKey(boxes[i])) {// 正是由于从右向左,保证了它是最新的next[i] = hashMap.get(boxes[i]);}// 记录数字的下标hashMap.put(boxes[i], i);}int[][][] memo = new int[len ][len][len];for (int i = 0; i < len; i++) {for (int j = 0; j < len; j++) {Arrays.fill(memo[i][j],-1);}}return removeBoxes( memo, next, 0, 0, len - 1);}/**** @param memo* @param next* @param preSame 前面相同的数有几个* @param left* @param right* @return*/private int removeBoxes( int[][][] memo, int[] next, int preSame, int left, int right) {if (left > right) {return preSame * preSame;}if (memo[preSame][left][right] != -1) {return memo[preSame][left][right];}// 结果至少是这个数字int res = preSame * preSame;int index = left;// 只要它下一个的下标正好是连续的,index 就 + 1while (next[index] == index + 1 && index + 1 <= right) {index++;}res = Math.max(res, (preSame + index - left + 1) * (preSame + index - left + 1) +removeBoxes( memo, next, 0, index + 1, right));int nextJ = next[index];while (nextJ <= right) {res = Math.max(res,removeBoxes(memo, next, 0, index + 1, nextJ - 1)+ removeBoxes( memo, next, preSame + index - left + 1, nextJ, right));nextJ = next[nextJ];}memo[preSame][left][right] = res;return res;}public static void main(String[] args) {Solution2 solution2 = new Solution2();int[] boxes = new int[]{1, 3, 2, 2, 2, 3, 4, 3, 1};int res = solution2.removeBoxes(boxes);System.out.println(res);}
}

「力扣」第 546 题:移除盒子(很难的动态规划问题)相关推荐

  1. LeetCode 546. 移除盒子 (很难的一道DP)

    546. 移除盒子 不解释官方的了... 必须要知道的是,仅仅用[l,r][l,r][l,r]是不够记录状态的,子区间[l,r][l,r][l,r]不仅仅依赖于它的子区间,还依赖之前移动的顺序! 官方 ...

  2. 几乎刷完了力扣所有的树题,我发现了这些东西

    点击蓝色"力扣加加"关注我哟 加个"星标",带你揭开算法的神秘面纱! ❝ 这是力扣加加第「28」篇原创文章 先上下本文的提纲,这个是我用 mindmap 画的一 ...

  3. python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?

    今天用Python求解「羊车门」经典的概率问题,对概率学基础和Python语法的灵活运用有所收货. 本次「羊车门」求解过程采用的是:穷举法计算概率已验证概率学基础理论.期间重点借鉴了'奥卡姆剃刀的博客 ...

  4. 力扣第十五题-三数之和

    前言 力扣第十五题 三数之和 如下所示: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复 ...

  5. C#实现力扣双周赛算法题:以组为单位订音乐会的门票订购

    目录: 前言: 一,算法题目描述 二,基本概念理解: 三,例子引入分析 四,代码解释 (1)安排座位函数 (2)查询函数 (2)求出1到RPS内的最小下标 (3)gather函数 (4)scatter ...

  6. 力扣算法1~10题(js)

    标题 力扣算法 文章目录 标题 1.贩卖柠檬水,能否正确找零 错误 思路一: 解法一 缺点:耗时太长 解法二(大佬解法) 2.返回nums中和为target的两个数的下标 解法 3.两数相加 思路与算 ...

  7. 力扣数据库题目刷题日记

    一个准备秋招的菜鸟 此前已经在力扣上面刷过一些题目,从今天开始记录刷题 1. Day1 96/97题 难度:中等 解题思路 首先需要读懂题目的意思,必须要保证容量大于相同分数的人数的同时,选择最低的分 ...

  8. 力扣105和106题

    从前序与中序遍历中构造二叉树:从中序与后序遍历构造二叉树(力扣105和106) 模仿官方105答案,写出106题 //105题(官方) class Solution {public TreeNode ...

  9. 马斯克刚骂了激光雷达,这篇用纯视觉代替激光雷达的名校论文「力挺」了他...

    昨天,第 N 次在公开场合 diss 激光雷达的马斯克,再一次让自动驾驶圈对无人车不同的传感器应用方案展开了热议. 实际上,如果站在马斯克的角度,我们其实不难理解他对激光雷达的「痛恨心理」. 毕竟特斯 ...

最新文章

  1. 华为手机安装系统能换鸿蒙,华为鸿蒙将全面上线,安卓系统或将被彻底替换
  2. select2删除选中项,allowClear设置
  3. android 手机壁纸源码,Android工程实现换壁纸功能【附源码】
  4. 漫步数学分析八——集合边界
  5. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(6) - 64位RFLAGS
  6. ERROR 2006 (HY000) MySQL server has gone away
  7. 【android】Airtest IDE实现多设备管理以及自动装包
  8. 取代Cookie失败,Google上线FLoC反遭“围攻”!
  9. mysql基线检查_Mysql安全基线检查
  10. Chrome历史版本查看
  11. 让电脑「读懂」你的思想——java工程师的职业规划
  12. 软件成分分析(SCA)完全指南
  13. 机器视觉——相机标定(摄像机标定)
  14. 读书 曾国藩(最新图文版)
  15. Nuxt.js mini聊天室开发 (mini-chatroom)
  16. 作为应届生到底是去大的IT公司好,还是去小的IT公司好?
  17. 关于数据菜单如何从后端获取数据
  18. Tomcat单机多实例配置
  19. Redis 持久化——RDB 详解
  20. 蚂蚁金服组件 ReferenceError: primordials is not defined

热门文章

  1. Unity Addressable学习笔记一(整体介绍)
  2. 用js来写一个478呼吸动画来做393的默想吧-用js来写一个478呼吸动画
  3. 什么叫数据与程序的物理独立性?什…
  4. linux系统笔记本如何投屏,Linux版手机投屏Qtscrcpy
  5. Python·os.path.abspath和os.path.realpath区别
  6. 两个umijs/max项目使用微前端简单示例
  7. 闹剧还是情有可原?联想撤回科创板上市申请后,股价大跌13%
  8. 2013各大公司的待遇如下
  9. 建设工程项目质量成本优化与控制
  10. CTFshow命令执行29-123