给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。
你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。
当你将所有盒子都去掉之后,求你能获得的最大积分和。

示例 1:
输入:

[1, 3, 2, 2, 2, 3, 4, 3, 1]

输出:

23

解释:

[1, 3, 2, 2, 2, 3, 4, 3, 1]
----> [1, 3, 3, 4, 3, 1] (3*3=9 分)
----> [1, 3, 3, 3, 1] (1*1=1 分)
----> [1, 1] (3*3=9 分)
----> [] (2*2=4 分)

思路:

涉及子串的动态规划一般从子串两端进行递推,即(i,j)子串。 
分析如下: 
dp[i][j][k]表示从i到j子串并且右端存在与j相同的k个字符其获得的最大点数。 
有1,3,2,2,2,3,3 
    i                          j                                   dp[i][j][1]        
此时有两种可选操作: 
1、将j以及其后面的连续相同的串消除获得点数:dp[i][j-1][0]+(k+1)*(k+1) 
      1,3,2,2,2,4,3,1  ——>  dp[i][j][0]+2*2 
2、在子串内部寻找与右端相同的字符,将子串划分成两部分,先消除内部,再消除右端:dp[i][p][k+1]+dp[p+1][j-1][0] 
      1,3,3,1  ——>  dp[i][p][k+1] 
      2,2,2,4  ——>  dp[p+1][j-1][0] 
dp[i][j][k]最大值为上面两种情况的最大值,代码如下

Python版:

class Solution:def removeBoxes(self, boxes):""":type boxes: List[int]:rtype: int"""#涉及子串动态规划利用(i,j)进行地推   dp[i][j][k]表示从i到j子串并且右端存在与j相同的k个字符其获得的最大点数。n = len(boxes)dp = [[[0]*n for _ in range(n)]for _ in range(n)]return self.robot(boxes,dp,0,n-1,0)def robot(self,boxes,dp,x,y,k):if x > y:return 0if dp[x][y][k] > 0:return dp[x][y][k]while x < y and boxes[y] == boxes[y-1]:y -= 1k += 1dp[x][y][k] = self.robot(boxes,dp,x,y-1,0) + (k+1)*(k+1)for i in range(x,y):if boxes[i] == boxes[y]:dp[x][y][k] = max(dp[x][y][k],self.robot(boxes,dp,x,i,k+1) + self.robot(boxes,dp,i+1,y-1,0))return dp[x][y][k]

LeetCode 546. 移除盒子 Python相关推荐

  1. LeetCode 546. 移除盒子 | Python

    546. 移除盒子 题目 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个 ...

  2. leetcode 546. 移除盒子 —— 动态规划

    将上面记忆化存储的递归算法,改为递推算法.即动态规划法. 546. 移除盒子 题目: 546. 移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作 ...

  3. Java实现 LeetCode 546 移除盒子(递归,vivo秋招)

    546. 移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子( ...

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

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

  5. LeetCode#546. 移除盒子 (Python解法+详细分析)

    问题描述: 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子(k &g ...

  6. LeetCode 546. 移除盒子(DP)*

    文章目录 1. 题目 2. 解题 1. 题目 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止. 每一轮你可以移除具有 ...

  7. LeetCode第 546 题:移除盒子(C++) (弃)

    546. 移除盒子 - 力扣(LeetCode) 典型的动态规划最大值问题,单次移除的盒子个数(k)越多,得到的积分 k*k 就会越大,所以每次操作肯定会把连续的相同颜色的盒子都去掉. 注意: 这题还 ...

  8. ​LeetCode刷题实战546:移除盒子

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素

    题目描述 原题链接:LeetCode 27. 移除元素 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 ...

最新文章

  1. 《强化学习周刊》第32期:上海交大华为 | 可解释强化学习研究综述
  2. 普博去该知名城市,直接先赠送80㎡公寓,每月生活补贴5000,最高100万项目经费!...
  3. 我所理解的UTF-8和GBK
  4. 随笔② Java中的关键字 --- final关键字
  5. HTML与CSS布局技巧总结
  6. 3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析
  7. 551. 学生出勤记录
  8. 漫谈LiteOS-LiteOS SDK支持RISC-V架构
  9. 2.6 wpf标记扩展
  10. 查找某个整数(数组)
  11. SQL2005 第一次配置没有服务器名称的问题
  12. 微波工程基础_军工央企丨上海微波设备研究所
  13. 多元统计分析基于r课后答案_应用多元统计分析课后答案.doc
  14. 如何通过Flow制作简单的工作流 - 请假审批2
  15. 时空序列预测之Convolutional LSTM Network
  16. 小白跑WRF第七天,运行WRF案例
  17. Codeforces 1153
  18. python 抖音文案提取_一篇文章教会你用Python抓取抖音app热点数据!
  19. 微信网页扫码登录和公众号网页授权登录的比较
  20. 高并发场景下秒杀系统的设计思路

热门文章

  1. scratch案例——九九乘法
  2. ANFIS学习笔记(二)
  3. ISE驱动缺失处理 无法正常启动(代码10)
  4. 计算机温度测控技术程序,基于单片机的温度测控系统
  5. Ansoft SIMPLORER 6.0 (多领域仿真软件)\
  6. 关于第二界“中科杯”全国软件设计大赛
  7. GarageBand 下载加速
  8. Mac 使用终端关机的命令
  9. 超详细宝塔面板搭建和安装wordpress网站图文教程(附案例)
  10. 华创芯光朱斌斌博士受邀坪山区半导体产业创新发展高端研讨会