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

Leetcode546

给定一个整数序列,每次删除其中连续相等的子序列,得分为序列长度的平方 求最高得分。

dp方程如下:

memo[l][r][k] = max(memo[l][r][k], dfs(boxes,memo,l,i,k+1) + dfs(boxes,memo,i+1,r-1,0));

意思是在序列的l-r部分后接k长度的 r值序列 所能得到的最大得分。

代码很简单

class Solution {
public:
    int removeBoxes(vector<int>& boxes) {
        int n=boxes.size();
        int memo[100][100][100] = {0};
        return dfs(boxes,memo,0,n-1,0);
    }

    int dfs(vector<int>& boxes,int memo[100][100][100], int l,int r,int k){
        if (l>r) return 0;
        if (memo[l][r][k]!=0) return memo[l][r][k];

        while (r>l && boxes[r]==boxes[r-1]) {r--;k++;}
        memo[l][r][k] = dfs(boxes,memo,l,r-1,0) + (k+1)*(k+1);
        for (int i=l; i<r; i++){
            if (boxes[i]==boxes[r]){
                memo[l][r][k] = max(memo[l][r][k], dfs(boxes,memo,l,i,k+1) + dfs(boxes,memo,i+1,r-1,0));
            }
        }
        return memo[l][r][k];
    }
};

  

时间: 2024-08-27 12:59:37

第十周 Leetcode 546. Remove Boxes (HARD) 记忆化搜索的相关文章

leetcode 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

集训第五周动态规划 I题 记忆化搜索

Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子

[LeetCode] 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

20172324 2017-2018-2 《程序设计与数据结构》第十周学习总结

20172324 2017-2018-2 <程序设计与数据结构>第十周学习总结 教材学习内容总结 集合的概念 集合是储存对象的,长度可变,可以封装不同的对象 迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 集合与数据结构 集合是一种对象,类似于保存其他对象的存储库. 我们常常用集合表示一个专门用于保存元素的对象,并且该对象还提供增添.删除等管理所保存元素的服务.例如Arraylist类. 集合的同构与异构 同构:只保存同类元素 异构:可保存不同类元素 动态结构 建立动态结构

第十周课下作业

第十周课下作业(补做课堂测试) 一.知识点总结 1.单链表 创建单链表 链表中数据的插入list.add("**"); 链表中数据的排序Collections.sort(); 链表中数据的删除lsit.remove(""); 2.排序 树集概念 树映射 TreeMap<K,V>**适合用于数据的排序** 通过关键字进行排序TreeMap<StudentKey,Student> treemap= new TreeMap<StudentKe

第十周课下补做

20165339第十周课上测试补做 一.相关知识点 创建链表:LinkedList<String> mylist=new LinkedList<String>(); 增加节点:list.add(E obj) 删除节点:list.remove(index) 遍历链表:(迭代器)链表对象用iterator()方法获得一个Iterator对象.用get(int index)方法返回列表中的第index个对象. 排序:public static sort(List<E> lis

20165322 第十周课下补做

第十周课下补做 课程知识点总结 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: Comparable:"可比较的",(欲参与比较的对象对应的元素类需实现Comparable接口) 使用这种策略来比较时,两个对象(这里两个对象是指一个类的两个不同实例)本身必须是"可比较的",比较的标准由对象所在的类来定义,这种可比较的能力是对象本身固有的,因此不需要第三方参与就可以完成比较.要使得两个对象本身是可比较的,那么对象所在的类必须实现Compa

20165332第十周课下作业

20165332第十周课下作业 知识点总结 创建一个空的链表 List 向链表中添加新的结点 list.add(new Student(XXXXXXXXXXXXXXX)); 删除结点 list.remove("xxxxxxx"); 链表中数据的插入 list.add("**"); 链表中数据的排序 Collections.sort(); 将list中的元素按升序排序 public static sort(List 习题二 代码: import java.util.*

20172313 2017-2018-2 《程序设计与数据结构》第十周学习总结

20172313 2017-2018-2 <程序设计与数据结构>第十周学习总结 教材学习内容总结 了解集合的同构和异构:同构集合保存类型全部相同的对象,异构集合可以保存各种类型的对象. 集合可以用各种方式实现,保存对象的基础数据结构可以用各种技术来实现. 学习动态结构,初步学习链表中的增删查改. 学习线性数据结构:队列(queue)先进先出,堆栈(stack)先进后出. 了解非线性数据结构:树(由一个根节点和构成层次结构的多个节点组成),图(连接一个图内各节点的边数一般没有限制). 了解Jav