题目链接:

https://leetcode.com/problems/remove-boxes/description/

问题描述

若干个有序排列的box和它们的颜色,每次可以移除若干个连续的颜色相同的box,且得分为移除个数的平方,求最大的得分。

n不超过100.

输入

输入n个箱子的颜色。

输出

输出最大的得分。

样例输入

1, 3, 2, 2, 2, 3, 4, 3, 1

样例输出

23

题解

令dp[l][r][k]表示前面有k个和box[l]同颜色的要和box[l]一起消除,现在考虑l是不是最后一个消的,这样的话可以得到转移方程:dp[l][r][k]=max((k+1)^2+dp[l+1][r][0],dp[l+1][m-1][0]+dp[m][r][k+1])(l+1<=m<=r);

这道题在状态的表示上比较有技巧,主要是因为涉及到了子问题的self-contain的问题,具体的可以看推荐题解

代码

int dp[101][101][101];
class Solution {
public:
int dfs(vector<int>& nums,int l,int r,int k){
if(l>r) return 0;
if(l==r) return (k+1)*(k+1);
if(dp[l][r][k]>=0) return dp[l][r][k];
int ll=l,rr=r,kk=k;
for(;l+1<=r&&nums[l]==nums[l+1];l++,k++);
dp[l][r][k]=dfs(nums,l+1,r,0)+(k+1)*(k+1);
for(int i=l+1;i<=r;i++){
if(nums[i]==nums[l]){
dp[l][r][k]=max(dp[l][r][k],dfs(nums,l+1,i-1,0)+dfs(nums,i,r,k+1));
}
}
return dp[ll][rr][kk]=dp[l][r][k];
}
int removeBoxes(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++) for(int j=i;j<n;j++) for(int k=0;k<n;k++) dp[i][j][k]=-1;
return dfs(nums,0,n-1,0);
}
};

Leetcode 546. Remove Boxes的更多相关文章

  1. 第十周 Leetcode 546. Remove Boxes (HARD) 记忆化搜索

    Leetcode546 给定一个整数序列,每次删除其中连续相等的子序列,得分为序列长度的平方 求最高得分. dp方程如下: memo[l][r][k] = max(memo[l][r][k], dfs ...

  2. 546. Remove Boxes

    Given several boxes with different colors represented by different positive numbers. You may experie ...

  3. 546 Remove Boxes 移除盒子

    给定一些不同颜色的盒子,以不同的正整数表示.消去连续相同颜色的盒子,直到全部消除完毕为止.每一次消去可以得到k * k分(k为消去盒子的个数, k  >= 1).计算可以得到的最大得分.注意:盒 ...

  4. [LeetCode] Remove Boxes 移除盒子

    Given several boxes with different colors represented by different positive numbers. You may experie ...

  5. [Swift]LeetCode546. 移除盒子 | Remove Boxes

    Given several boxes with different colors represented by different positive numbers. You may experie ...

  6. LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++>

    LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++> 给出排序好的一维数组,如果一个元素重复出现的次数 ...

  7. LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++>

    LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++> 给出排序好的 ...

  8. [LeetCode] 80. Remove Duplicates from Sorted Array II ☆☆☆(从有序数组中删除重复项之二)

    https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/discuss/27976/3-6-easy-lines-C% ...

  9. [LeetCode] 82. Remove Duplicates from Sorted List II_Medium tag: Linked List

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinctnumbe ...

随机推荐

  1. 个人技术博客--团队Git规范(参考西瓜学长)

    援引西瓜学长:GitHub团队项目合作流程 废话少说直接写 1.fork 1.对于组员来说第一步就是fork 2.点击fork之后 上面是我们的团队仓库 切换回自己的仓库 就会看到 是fork于团队仓 ...

  2. CRM项目之stark组件(1)

    admin组件 admin组件的简单使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py ...

  3. socket.io+angular.js+express.js做个聊天应用(三)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...

  4. OPTIMIZER_INDEX_COST_ADJ 与OPTIMIZER_INDEX_CACHING 参数说明

    [部分转载]http://www.xifenfei.com/2012/06/optimizer_index_caching和optimizer_index_cost_adj参数说明.html 1. O ...

  5. Sysbench-OLTP数据库测试

    使用sysbench进行oltp测试之前,需要核对一下sysbench的版本,因为不同版本在使用的参数时,会有一定的差异. mysql dba这本书中的sysbench使用的是0.5的版本,ubunt ...

  6. oracle ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN callout

    Mon Jun 11 21:59:52 2018LNS: Standby redo logfile selected for thread 2 sequence 132997 for destinat ...

  7. mybatis多数据源切换

    文章转自https://yq.aliyun.com/articles/188540?t=t1 https://www.liaoxuefeng.com/article/00151054582348974 ...

  8. Linux中添加、修改和删除用户和用户组

    宽为限 紧用功 功夫到 滞塞通 一.用户: 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组user ...

  9. 【转】对random_state参数的理解

    转自:https://blog.csdn.net/az9996/article/details/86616668 在学习机器学习的过程中,常常遇到random_state这个参数,下面来简单叙述一下它 ...

  10. webpack2 项目构建一

    最近工作忙,学习被暂停了,还是网上多看看资料,多学习学习一下,看到一些好的资料,自己想整理一下,这不,webpack2项目构建都还没有弄懂,webpack3就已经发布了,说实话周末现在真不想看书和研究 ...