【算法】区间DP

基本内容

[!NOte]

通过分治的思想实现DP数组

  • 入门例子 NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态

题目要求:给定一圈石头数组,每个石头对应一个权重值,当两个石头合并时组成一个小石头堆,成本为两个石头权重值相加,当两个石头堆合并时组成一个大石头堆, 成本为两个小石头堆的权重值相加。

  • 例子简化

​ 先从简单的情况入手,不考虑围成圈的情况,假设石头堆是连续的数组,首尾不连接

image

​ 不难发现,最后一次合并所需要的成本一定是所有石头的权重值之和,最后剩下的两堆石头可能为:【4】和【5,9,4】或者【4,5】和【9,4】或者【4,5,9】和【4】,所有情况的最后一次合并的成本是一个常数项,假设合成最后一个大堆的两个小堆分别为smallA,smallB, 则合成的所需的成本为:
v a l u e = v a l u e a + v a l u e b + C value =value_a+value_b+C value=valuea+valueb+C
其中C为最后一次合并的成本,因此,只要求出 v a l u e a value_a valuea v a l u e b value_b valueb的最小值即可。

​ 通过以上思路,可以对smallAsmallB进一步进行划分为更小的堆,直到堆的石头个数为1,即为最小的堆。

  • 代码变量解释

[!note]

目前求合成石头堆的最小成本,我们已经知道只有找到两个组成这个大堆的成本最小的堆即可,因此需要在一个二维数组中存取从 LR石头合成的最小成本。

f[i][j]:二维数组,表示合成第i个石头到第j个石头所需的最小成本;

g[i][j]:二维数组,表示合成第i个石头到第j个石头所需的最大成本;

s:前缀和数组,方便计算石头堆最后一次合并的成本C

  • 解题代码
N = int(input())
stones = list(map(int, input().split()))
f = [[0 for i in range(len(stones))] for i in range(len(stones))] 
g = [[0 for i in range(len(stones))] for i in range(len(stones))]
s = [0] * (len(stones) + 1)
# 计算前缀和
for i in range(1, len(stones) + 1):
    s[i] = stones[i - 1] + s[i - 1]
# 一个大堆是由两个中堆组成,一个中堆又有两个小堆组成...,因此需要遍历合成一个小堆的个数,最小的堆是2
for length in range(2, len(stones)+1):
    l = 0
    while l + length -1  < len(stones):
        r = l + length - 1
        f[l][r] = float("inf")
        g[l][r] = -float("inf")
        for k in range(l,r):
            f[l][r] = min(f[l][r], f[l][k] + f[k+1][r] + s[r+1] - s[l])
            g[l][r] = max(g[l][r], g[l][k] + g[k+1][r] + s[r+1] - s[l])
        l += 1
print(f[0][len(stones)-1])
print(g[0][len(stones)-1])
  • 围成圈的情况

💡 所有围成圈的算法题,都可以视为是普通队列的特殊情况,以石头合并的例子为例,一个石头数组的长度为N,可以将石头数组延长一份,并且以大小为N的窗口大小移动,即可得到最终的结果,在时间复杂度上需要$\times$2

image

  • 最终代码
N = int(input())
stones = list(map(int, input().split()))
stones = stones + stones
f = [[0 for i in range(len(stones))] for i in range(len(stones))]
g = [[0 for i in range(len(stones))] for i in range(len(stones))]
s = [0] * (len(stones) + 1)
# 计算前缀和
for i in range(1, len(stones) + 1):
    s[i] = stones[i - 1] + s[i - 1]
for length in range(2, N+1):
    for l in range(2 * N - length + 1):
        r = l + length - 1
        f[l][r] = float("inf")
        g[l][r] = -float("inf")
        for k in range(l,r):
            f[l][r] = min(f[l][r], f[l][k] + f[k+1][r] + s[r+1] - s[l])
            g[l][r] = max(g[l][r], g[l][k] + g[k+1][r] + s[r+1] - s[l])
minV = float("inf")
maxV = -float("inf")
for i in range(N):
    minV = min(minV, f[i][i+N-1])
    maxV = max(maxV, g[i][i+N-1])
print(minV)
print(maxV)

题目

  1. 1547. 切棍子的最小成本

题目要求:

cuts = [0] + sorted(cuts) + [n]
length = len(cuts)

# 初始化 DP 数组
f = [[0] * length for _ in range(length)]

# 动态规划计算最小切割代价
for len_interval in range(2, length):  # 区间长度
    for l in range(length - len_interval):  # 左边界
        r = l + len_interval  # 右边界
        f[l][r] = float("inf")
        # 选择切割点 k,使得当前切割的代价最小
        for k in range(l + 1, r):
            f[l][r] = min(f[l][r], f[l][k] + f[k][r] + cuts[r] - cuts[l])

return f[0][length - 1]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习—决定下一步做什么

现在已经看到了很多不同的学习算法&#xff0c;包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价&#xff0c;所以你有通常的学习算法的成本函数平方误差加上这个正则化项&#xff0c;但是如果…

第二十周机器学习笔记:初步认识PINN

第二十周周报 摘要Abstract一、初步认识物理信息神经网络&#xff08;PINN&#xff09;1.PINN的基本概念2. PINN与传统机器学习的区别3.构建PINN的步骤 二、代码实战——比较RNN、LSTM、Transformer在股市预测的表现1.RNN在股市预测中的表现2.LSTM在股市预测中的表现3.Transfor…

数据结构的时间复杂度和空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数&#xff0c;为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用&#xff1f; 先看例子&#xff1a; 在这个例子中&#xff0c; 基本操作为变量 count 的 加加 操作&#xff0c;并且&#xff0c;执行…

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间

SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

多模态与大模型技术赋能企业数据资产平台建设

文章目录 一、政策背景分析二、企业数据资产运营平台架构思路三、统一多模技术赋能企业数据底座建设四、大模型助力数据资产管理降本增效五、典型案例分享 一、政策背景分析 2023年10月&#xff0c;国家数据局正式挂牌&#xff0c;负责协调推进数据基础制度建设&#xff0c;并…

【CentOS】中的Firewalld:全面介绍与实战应用(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、iptables 时代 2、firewalld 时代 3、 从 ipt…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

NVT新能德科技入职测评SHL题库更新:数字推理+演绎推理高分答案、真题解析

新能德的入职Verify测评主要考察应聘者的逻辑推理能力、数学能力、数据分析能力以及处理信息的能力。根据搜索结果&#xff0c;测评通常包含以下几个部分&#xff1a; 1. **语言理解**&#xff1a;这部分包括阅读理解、逻辑填空和语句排序。要求应聘者在17分钟内完成30题&#…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…

Linux:进程概念

文章目录 前言一、冯诺依曼体系二、操作系统(Operator System)2.1.操作系统的概念2.2 系统调⽤和库函数概念 三. 进程3.1 基本概念3.1.1 描述进程3.1.2 task_struct 3.2 查看进程3.2.1 getpid3.2.2 proc3.2.3 getppid 总结 前言 • 课本概念&#xff1a;程序的⼀个执⾏实例&am…

el-form el-table 前端排序+校验+行编辑

一、页面 <template><div class"bg" v-if"formData.mouldData?.length 0">当前暂无模板&#xff0c;点击<view class"add" click"addMould">立即创建</view></div><div v-else><el-col :x…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

基于Java Springboot旅游信息推荐系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0…

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考&#xff1a;5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

iStore OS 插件的手动安装与特殊卸载

有些插件在iStore 中并没有展示,因此需要手动安装,手动安装无法通过前端彻底卸载,本文提供方法和流程。 1.插件手动安装 1.1地址 github 项目地址根据自己需求选择。本人以x86_64 为主。 https://github.com/AUK9527/Are-u-ok/tree/main/x86 点击后下载得到run安装包 1…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…