区间DPⅡ (Java) 解析/模板/案例

news2025/1/12 6:05:10

一. 区间DP简单介绍 

二. 区间DP模板

三. 区间DP经典案例

1.leetcode1312 让字符串成为回文串的最少插入次数

2.leetcode1039 多边形三角剖分的最低得分

以上部分,见

区间DP (Java) 解析/模板/案例

3.leetcode1547 切棍子的最小成本

有一根长度为 n 个单位的木棍,棍上从 0 到 n 标记了若干位置。例如,长度为 6 的棍子可以标记如下:

给你一个整数数组 cuts ,其中 cuts[i] 表示你需要将棍子切开的位置。

你可以按顺序完成切割,也可以根据需要更改切割的顺序。

每次切割的成本都是当前要切割的棍子的长度,切棍子的总成本是历次切割成本的总和。对棍子进行切割将会把一根木棍分成两根较小的木棍(这两根木棍的长度和就是切割前木棍的长度)。请参阅第一个示例以获得更直观的解释。

返回切棍子的 最小总成本 。

 输入:n = 7, cuts = [1,3,4,5]
输出:16
解释:按 [1, 3, 4, 5] 的顺序切割的情况如下所示:
第一次切割长度为 7 的棍子,成本为 7 。第二次切割长度为 6 的棍子(即第一次切割得到的第二根棍子),第三次切割为长度 4 的棍子,最后切割长度为 3 的棍子。总成本为 7 + 6 + 4 + 3 = 20 。
而将切割顺序重新排列为 [3, 5, 1, 4] 后,总成本 = 16(如示例图中 7 + 4 + 3 + 2 = 16)。

class Solution {
    public int minCost(int n, int[] cuts) {
        Arrays.sort(cuts);
        int len = cuts.length;
        int[] cutsSE = new int[len+2];
        cutsSE[len+1] = n;
        for(int i = 0; i < len; i++){
            cutsSE[i+1] = cuts[i]; 
        }
        int lenSE = cutsSE.length;
        int[][] dp = new int[lenSE][lenSE];
        for(int i = lenSE-2; i >= 0; i--){
            for(int j = i+2; j < lenSE; j++){
                dp[i][j] = 0x3f3f3f3f;
                for(int k = i+1; k < j; k++){
                    dp[i][j] = Math.min(dp[i][j],dp[i][k]+dp[k][j]+(cutsSE[j]-cutsSE[i]));
                }
            }
        }
        return dp[0][lenSE-1];
    }
}

此题和第2题 leetcode1039 多边形三角剖分的最低得分 一样,也是可以枚举切点。对于区间DP的一大部分题目,都是可以枚举左右切点,不必枚举长度,枚举左右端点其实也相当于枚举长度。

 

 

 

4.leetcode375 猜数字大小 II

我们正在玩一个猜数游戏,游戏规则如下:

我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

输入:n = 10
输出:16
解释:制胜策略如下:
- 数字范围是 [1,10] 。你先猜测数字为 7 。
    - 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $7 。
    - 如果我的数字更大,则下一步需要猜测的数字范围是 [8,10] 。你可以猜测数字为 9 。
        - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $9 。
        - 如果我的数字更大,那么这个数字一定是 10 。你猜测数字为 10 并赢得游戏,总费用为 $7 + $9 = $16 。
        - 如果我的数字更小,那么这个数字一定是 8 。你猜测数字为 8 并赢得游戏,总费用为 $7 + $9 = $16 。
    - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,6] 。你可以猜测数字为 3 。
        - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $3 。
        - 如果我的数字更大,则下一步需要猜测的数字范围是 [4,6] 。你可以猜测数字为 5 。
            - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $5 。
            - 如果我的数字更大,那么这个数字一定是 6 。你猜测数字为 6 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
            - 如果我的数字更小,那么这个数字一定是 4 。你猜测数字为 4 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
        - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,2] 。你可以猜测数字为 1 。
            - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $1 。
            - 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $7 + $3 + $1 = $11 。
在最糟糕的情况下,你需要支付 $16 。因此,你只需要 $16 就可以确保自己赢得游戏。
class Solution {
    public int getMoneyAmount(int n) {
        int[][] dp = new int[n+1][n+1];
        for(int i = n-1; i >= 1; i--){
            for(int j = i+1; j <= n; j++){
                dp[i][j] = 0x3f3f3f3f;
                for(int k = i; k < j; k++){
                    dp[i][j] = Math.min(dp[i][j],Math.max(dp[i][k-1],dp[k+1][j])+k);
                }
            }
        }
        return dp[1][n];
    }  
}

本题小结:

(1)由于题目要求是从 1 到 n 之间选择一个数字,所以dp数组最后返回的范围也是 dp[1][n]

(2)对应数组的长度被设置成int[n+1][n+1]

(3)i的枚举顺序从大到小,这和前几题的原因是一样的,不再赘述

(4)本题最难的部分,为min函数中的max函数,即在选择k的左右子区间选择大的值

(5)考虑到最坏的情况,所以在k的左右两边取大值,而题目要求最小现金数,明显在外层是min函数

5.leetcode1000 合并石头的最低成本

有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。

每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。

找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。

输入:stones = [3,2,4,1], K = 2
输出:20
解释:
从 [3, 2, 4, 1] 开始。
合并 [3, 2],成本为 5,剩下 [5, 4, 1]。
合并 [4, 1],成本为 5,剩下 [5, 5]。
合并 [5, 5],成本为 10,剩下 [10]。
总成本 20,这是可能的最小值。

输入:stones = [3,2,4,1], K = 3
输出:-1
解释:任何合并操作后,都会剩下 2 堆,我们无法再进行合并。所以这项任务是不可能完成的。.
class Solution {
    public int mergeStones(int[] stones, int k) {
        int len = stones.length;
        if((len-1) % (k-1) > 0) return -1;
        int[][] dp = new int[len][len];
        int[] pre = new int[len+1]; 
        for(int i = 0; i < len; i++){
            pre[i+1] = pre[i]+ stones[i];
        }
        for(int i = len-1; i >=0; i--){
            for(int j = i+1; j < len; j++){
                dp[i][j] = 0x3f3f3f3f;
                for(int x = i; x < j; x += k-1){
                    dp[i][j] = Math.min(dp[i][j], dp[i][x]+dp[x+1][j]);
                }
                if((j-i) % (k-1) == 0){
                    dp[i][j] += pre[j+1] - pre[i];
                }
            }
        }
        return dp[0][len-1];
    }
}

本题小结:

(1)假设长度为n,最后变为1堆,那么较少的数量为n-1个,每次把k个合并为一个,减少的部分为k-1个,当(len-1) % (k-1) > 0 证明不能合并为一堆

(2)i为倒叙,j为正序,根据以上四题,情况相似,不再赘述

(3)x可看作切点,当从x切开,左右两边之和将构成整体,然后取整体最小情况

 

(4)左起i,右到j,如果(j-i) % (k-1) > 0则证明不能最后合并为一堆

(5)因为需要用到区间之和,所以需要使用前缀和

当案例为[3,2,4,1], k = 2时

我们合并3和2,那么可得到

[5,4,1],此时的和为5,也就是从3到2区间长度为2的区间之和

那么合并5和4,那么可得到

[9,1],此时的和为5+9,此轮花费为9,也就是从3到4区间长度为3的区间之和,一共花费为14

那么再进行合并,得到最后的结果,我们可知道,每轮的花费都是区间之和

最后的答案是选择的区间之和的和

那么区间之和可使用前缀和来处理

参考来源

[1] leetcode 灵茶山艾府 【图解】区间 DP:状态设计与优化(Python/Java/C++/Go)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IndexedDB的包装器JsStore - insert插入参数配置

JsStore是IndexedDB的包装器。它提供了简单的SQL&#xff0c;如api&#xff0c;易于学习和使用。IndexedDb查询可以在web worker中执行&#xff0c;JsStore通过提供一个单独的worker文件来保留这个功能。 Insert API用于在表中插入新记录&#xff0c;还可以为未在db模式中定义的…

使用InitializingBean和DisposableBean来管理bean的生命周期

1.InitializingBean接口 1.1.InitializingBean接口概述 Spring中提供了一个InitializingBean接口&#xff0c;该接口为bean提供了属性初始化后的处理方法&#xff0c;它只包括afterPropertiesSet方法&#xff0c;凡是继承该接口的类&#xff0c;在bean的属性初始化后都会执行…

docker compose 安装kafka集群

使用docker compsose部署kafka&#xff0c;方便快捷&#xff0c;启动方便。 1. 拉去镜像 docker pull bitnami/zookeeper:3.6 docker pull bitnami/kafka:3.0 docker pull hlebalbau/kafka-manager 2. 编辑docker compose文件 version: "3" services: zookeeper…

HummerRisk V1.0.1:k8s检测扩充、批量删除及修复bug

HummerRisk V1.0.1发布&#xff1a; K8s检测规则扩充新增 Rancher 和 KubeSphere类型、增加批量删除、增加阿里云检测类型&#xff0c;并修复了一些V1.0.0中发现的bug。感谢社区小伙伴发现并提交的问题。 HummerRisk 保持高速的迭代&#xff0c;期待您的关注。 https://docs…

FreeRTOS 信号量(四) ------ 互斥信号量

文章目录 一、互斥信号量简介二、创建互斥信号量1. xSemaphoreCreateMutex()2. xSemaphoreCreateMutexStatic() 三、互斥信号量创建过程分析四、释放互斥信号量五、获取互斥信号量 一、互斥信号量简介 互斥信号量其实就是一个拥有优先级继承的二值信号量&#xff0c;在同步的应…

【报错解决】错误代码18456,SQL Server 登录失败

【报错解决】错误代码18456&#xff0c;SQL Server 登录失败 一、故障原因二、解决办法2.1 使用Windows身份认证登录2.2 windows身份登录后&#xff0c;依次选择&#xff1a;安全性->登录名->sa&#xff0c;然后右击选择属性2.3 在常规选项中重新设置密码2.4 在设置中选择…

创新案例|语言教育App头牌Duolingo如何重新点燃用户增长350%

Duolingo是全球最大的语言教育APP&#xff0c;拥有数亿用户&#xff0c;然而用户增长正在放缓&#xff0c;本案例以Duolingo增长 通过数据建模洞察关键指标&#xff0c;并围绕指标用增长实验驱动&#xff0c;设计植根于创新的增长模式&#xff0c;包括启动排行榜&#xff0c;重…

基于MBD的控制系统建模与仿真软件工具集

随着新能源汽车和自动驾驶技术的快速发展&#xff0c;汽车电子电气架构的发展已成为汽车行业推陈出新的主要动力&#xff1a;车内电控系统变得越来越复杂、软件迭代周期越来越短&#xff0c;汽车电子软件开发和测试的质量与效率要求也越来越高。汽车电控系统的设计开发已然成为…

定时器+中断 闪烁led

文章目录 运行环境&#xff1a;1.1 定时器和中断1)定时器2)轮询和中断 2.1配置1&#xff09;定时器配置2)中断配置3)RCC和SYS 3.1代码分析3.2添加代码1)中断处理函数IRQ中添加代码2)launch设置 4.1定时器启动和定时器中断启动函数5.1实验效果 运行环境&#xff1a; ubuntu18.0…

VSCode 上的 swift 开发配置

安装Xcode和VsCode 在下列网址下载安装即可 VsCode: https://code.visualstudio.com/ Xcode:https://developer.apple.com/xcode/resources/ 或者apptore 打开xcode要求安装的东西都允许安装一下 启用 Swift 语言支持 确保你已经安装了 Xcode 和 VSCode。这是开始运行的最简…

【ITSS】信息技术服务标准(ITSS)的介绍以及发展历程

信息技术服务标准&#xff08;ITSS)介绍 ITSS是Information TechnologyService Standards的缩写&#xff0c;中文意思是信息技术服务标准&#xff0c;是在工业和信息化部、国家标准化委的领导和支持下&#xff0c;由ITSS工作组研制的一套IT服务领域的标准库和一套提供IT服务的方…

AD9208的4通道 14-bit、2.4GSPS采样率之中文版资料

板卡概述 FMC137 是一款基于 VITA57.4 标准规范的 JESD204B 接口FMC 子 卡 模 块 &#xff0c; 该 模 块 可 以 实 现 4 路 14-bit 、 2GSPS/2.6GSPS/3GSPSADC 采集功能。该板卡 ADC 器件采用 ADI 公司的 AD9208 芯片&#xff0c;&#xff0c;与 ADI 公司的 AD9689 可以实现…

python 零基础入门难度如何?

在入门前先来了解一下Python是什么。 Python&#xff0c;他其实是一种受众非常广的语言&#xff0c;简单易学&#xff0c;在网上有大把大把的入门教程&#xff0c;学习曲线平滑。除了“简单”“万能”之外&#xff0c;还有众多库&#xff0c;Python的标准库非常强大&#xff0…

TEMPUS FUGIT: 1

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;d3du 虚拟机网络链接模式&#xff1a;NET模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 探测目标靶机开放端口和服务情况。 nmap -p- -A -sV 192.168.255.132 nmap --scriptvuln -p …

lvs作业

文章目录 NAT模式DR模式 基于 CentOS 7 构建 LVS-DR 群集。 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 。基于 CentOS 7 构建 LVS-DR 群集。 NAT模式 在 LVS 的 NAT 模式中&#xff0c;LVS 将客户端请求的 IP 地址和端口号修改为 LVS 的 NAT …

golang/goland memo

文章目录 golanggolang开发工具goland Build constraints exclude all the Go files in xxxxxxgoland 解决 Unresolved reference xxx问题goland 解决 cannot resolve directory xxxx问题 golang GOROOT&#xff1a;Go的安装目录。 GOPATH 是一个环境变量&#xff0c;用于指定…

软件设计师笔记--计算机系统知识

文章目录 前言学习资料计算机系统CPU运算器控制器进制原码反码补码移码浮点数寻址奇偶校验码海明码循环冗余校验码RISC和CISC流水线存储器Cache中断输入输出控制方式总线加密技术与认证技术加密算法可靠性公式 前言 博主是非科班出身的&#xff0c;但从大一开始自学编程&#…

【JAVA程序设计】(C00132)基于SSM的固定资产管理系统

基于SSM的固定资产管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统为基于SSM的固定资产管理系统&#xff0c;本系统分为二种用户&#xff1a;超级管理员和普通管理员&#xff1b; 超级管理员功能&#xff1a; 首页查看、设备管理、平台账户管理、设备台账…

JavaScript经典教程(五)-- JavaScript基础 -- for、while、forEach、递归、字符串

186&#xff1a;JavaScript基础 - for、while、forEach、递归、字符串 1、循环 &#xff08;1&#xff09;for循环 1、标准语句 for(初始条件;判断条件;迭代语句){操作内容; }也可以这样写&#xff1a;把初始条件和迭代语句拆出 var a 0; for(;a < 5;){alert(a);a; }其…

【软件测试】项目测试—MySQL数据库操作应用场景?必会知识详全(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 数据库在软件测试…