算法 | 动态dp学习笔记 | 未完待更

动态规划(DP)及相关经典问题讲解 前言 动态规划(DP)是计算机编程算法中非常重要的一个知识点,无论是校招 社招,面试官也经常喜欢出此类的编程题来考察面试者的编程能力, 这篇博客主要是概述一下dp的主要思想 然后重点归纳一下leetcode中 股票交易问题的讲解。 DP基础知识 DP简单可以总结为“一个模型三个特征”。 “一个模型”是指动态规划适合解决的问题的模型,也就是多阶段决策最优解模型(这个模型同时也是回溯 贪心解决问题的模型)。一般用动态规划解决最优问题时,解决问题需要经历多个决策阶段。每个决策阶段都对应着一组状态。然后我们寻找一 阅读详情

动态dp学习笔记?

前置知识
  • 树链剖分
  • 简单树形dp
  • 矩阵乘法
什么是动态dp

对一个dp进行修改操作…

传统做法是使用树链剖分…一条重链一条重链地进行dp

从例题入手——

luogu4719 【模版】动态dp

参考博文

很简单我们可以设出这么一个dp状态

d p [ u ] [ 0 / 1 ] dp[u][0/1] dp[u][0/1]其中 0 0 0表示不在集合里面的最大值, 1 1 1则表示在集合里面的最大值

那么有转移式子
d p [ u ] [ 0 ] = ∑ v ∈ s o n u m a x ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) dp[u][0]=\sum_{v \in {son}_u}max(dp[v][0],dp[v][1]) dp[u][0]=v∈sonu​∑​max(dp[v][0],dp[v][1])

d p [ u ] [ 1 ] = ∑ v ∈ s o n u d p [ v ] [ 0 ] dp[u][1]=\sum_{v \in son_u}dp[v][0] dp[u][1]=v∈sonu​∑​dp[v][0]

换句话说我们采取一种dfs和bfs混合的方式遍历这颗树,

每次到达一个重链的顶部的时候我们直接将这个重链全部塞到队列里,

然后我们递归下去遍历和重链相连的所有重链,最后处理这个重链,

当处理完这个重链之后我们发现我们已经处理完了这个重链顶所在的子树了

那么我们对于重链上的每一个点…先根据轻儿子的dp值 l d p [ u ] [ 0 / 1 ] ldp[u][0/1] ldp[u][0/1]
l d p [ u ] [ 0 ] = ∑ v ∈ l i g h t s o n u m a x ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) ldp[u][0]=\sum_{v \in lightson_u}max(dp[v][0],dp[v][1]) ldp[u][0]=v∈lightsonu​∑​max(dp[v][0],dp[v][1])

l d p [ u ] [ 1 ] = ∑ v ∈ l i g h t s o n u d p [ v ] [ 0 ] ldp[u][1]=\sum_{v \in lightson_u} dp[v][0] ldp[u][1]=v∈lightsonu​∑​dp[v][0]

那么我们就可以根据轻儿子的dp值跑dp
d p [ u ] [ 0 ] = l d p [ u ] [ 0 ] + m a x ( d p [ u . h e a v y s o n ] [ 0 ] , d p [ u . h e a v y s o n ] [ 1 ] ) dp[u][0]=ldp[u][0]+max(dp[u.heavyson][0],dp[u.heavyson][1]) dp[u][0]=ldp[u][0]+max(dp[u.heavyson][0],dp[u.heavyson][1])

d p [ u ] [ 1 ] = l d p [ u ] [ 1 ] + d p [ u . h e a v y s o n ] [ 0 ] dp[u][1]=ldp[u][1]+dp[u.heavyson][0] dp[u][1]=ldp[u][1]+dp[u.heavyson][0]

这样的转换使得树上问题转变成了序列上的问题

我们就可以使用线段树维护重链上的值

具体来讲,当我们修改一个点的值的时候,我们在对应的重链的线段树上进行修改,

此时会改变重链顶部的dp值,然后会改变重链顶的father的ldp值,

然后又对应了线段树上的单点修改,此时又会改变另一个重链顶的dp值,

那么如何在线段树上维护dp值呢???
  • 我们将转移变成floyd的矩阵乘法形式

C i , j = m a x k ( A i , k + B k , j ) C_{i,j}=max_k(A_{i,k}+B_{k,j}) Ci,j​=maxk​(Ai,k​+Bk,j​)

  • 加法对乘法和min,max运算都具有分配律·

那么就可以用树链剖分维护啦…

但是…树链剖分可以被特意构造的数据卡成 O ( n l o g n 2 ) O(nlog^2_n) O(nlogn2​)(链式堆(根号n个长度为根号n的链连成完全二叉树的形状))

就在这个时候全局平衡二叉树出现啦

线段树只是局部平衡…

我们在建全局平衡二叉树的时候

将每一个节点附上一个权值,权值为它所有轻儿子的siz之和+1,然后我们每次找这个链的带权重心,把他作为这一级的父亲,然后递归两边进行建bst

总结

当你学会了有动态dp这个东西的时候…

其实怎么样将dp转移转换成可以用线段树或者全局平衡二叉树维护的矩阵乘法就成为了关键…

这种将树上dp转换成序列dp用数据结构维护的思想是关键。

【学习笔记】动态规划—各种 DP 优化 设 j=p∗v[i]+r�=�∗�[�]+�,那么原方程可改为: dp[p∗v[i]+r]=max{dp[r+k∗v[i]]+(p−k)∗w[i]}��[�∗�[�]+�]=���{��[�+�∗�[�]]+(�−�)∗�[�]} (r∈[0,v[i]−1],(�∈[0,�[�]−1], p∈[1,⌊(V−r)/v[i]⌋],�∈[1,⌊(�−�)/�[�]⌋], k∈[p−min(⌊V/w[i]⌋,c[i]),p])�∈[�−���(⌊�/�[�]⌋,�[�]),�]) 阅读详情

相关推荐

目标检测中的困难样本挖掘:YOLOv5训练效果提升30%的秘诀

本文深入探讨了目标检测中困难样本挖掘的关键技术,特别是如何通过在线困难样本挖掘(OHEM)策略显著提升YOLOv5模型的性能。文章详细解析了困难样本的分类、识别机制及实战配置,并提供了数据标注策略与增强技巧,最终实现模型性能提升30%的突破。

weixin_30379531的博客 401

动态DP入门&线性动态DP

OI-WiKi上有一个动态DP讲解,直接讲到了树型DP领域,同时需要树链剖分,门槛有点高。本文针对线性DP做一个动态DP的讲解。首先当然要懂得一定的DP的相关知识,然后需要知道DP方程的矩阵表达。可以看这里——根据递推公式构造系数矩阵用于快速幂。很多DP的状态转移方程都可以写成矩阵形式,由此就有了矩阵快速幂优化和动态DP的基础。特别是本文专门举例的线性DP。

RBS的专栏 2132

Playwright与MCP协议结合:AI驱动的智能Web自动化测试实践

Web自动化测试是现代软件开发流程中保障产品质量的关键环节,其核心原理是通过程序模拟用户操作,对Web应用进行功能验证。传统自动化测试工具如Selenium和Playwright虽然提供了强大的API,但脚本编写和维护仍需较高的编程技能。随着AI技术的发展,智能测试成为新的趋势,它通过自然语言理解和自动化执行,显著降低了测试创建门槛。Model Context Protocol(MCP)作为一种连接AI模型与外部工具的开放协议,为自动化测试带来了“智能大脑”。通过将MCP与Playwright结合,测试人员

aoe41606的博客 604

【动态dp】

矩阵常数大,可以只维护矩阵中有用的信息。 本质是带修改的dp。当某一类dp的某一状态要求修改时,我们可以用数据结构优化转移,使修改后重新做一次dp的复杂度是O(c∗log⁡N)O(c*\log N)O(c∗logN)。 写出朴素dp方程。 根据方程选择转移方法:广义矩阵乘法或数据结构pushup 8.6.1.简单的方程——广义矩阵乘法中转移 适用条件:形如fi=(fi−1⊗a)⊕fi−1⊕c⊕⋯f_i=(f_{i-1}\otimes a) \oplus f_{i-1} \oplus c\oplus \c

Brilliance_Z的博客 2039

Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS

安装好了VINS-Mono所需的ROS noetic、Eigen3.4.0、Ceres2.10和OpenCV4.2.0等。VINS-Mono是在ROS melodic以及Ceres1的环境下开发的,因此需要适配高版本的环境。

zardforever123的博客 2万+

BambuStudio学习笔记:OpenCSG - 实时构造实体几何(CSG)渲染的 OpenGL 方案

**OpenCSG** 是一个基于 **OpenGL** 的 **构造实体几何(CSG)** 实时渲染库,通过 **深度剥离算法** 实现布尔运算(并集、交集、差集)的可视化。其核心目标是简化复杂几何体的交互式建模,适用于 CAD 原型设计、3D 打印预览、教育工具等场景。

zzzkk2009的专栏 929

动态dp(ddp)

详细讲解动态dp。

wanglianda2007的博客 709

步进电机选型避雷手册:为什么你的42HS电机总丢步?从相数、电流到散热全面拆解

本文深入剖析了42HS步进电机在高速或重载下易出现丢步问题的根本原因。文章指出,选型时不应仅关注静态保持转矩,而需重点分析动态矩频曲线、合理匹配驱动器电流与细分数、进行准确的机械传动惯量计算,并有效管理系统共振与散热。通过全面拆解这些关键因素,为工程师提供了实用的选型避雷指南与系统优化方案。

weixin_29275257的博客 97

动态规划【DP】详细解释

动态规划算法的复杂度和空间利用率很高,适用于求解一些比较复杂的最优化问题,例如背包问题、最长递增子序列问题、编辑距离问题等。无后效性:状态只与其之前的状态有关,和之后的状态无关。这种性质被称作“无后效性”,即在求解阶段,我们不必关心状态是如何转移过来的,只需要关注现在的状态和后续状态。(除去起点)中的所有点恰好一次,回到起点的最小代价,通过循环方式依次求出每一个状态并存储它的最小代价值,最终返回从起点出发,经过点集。好的,再举一个十分复杂的例子,以解决旅行家问题为例子,我们来详细介绍动态规划的思想和步骤。

Chey_LER_SLC的博客 2235

功能安全实战系列12-英飞凌TC3xx锁步核及其自检开发

本文介绍了英飞凌Tricore系列芯片的锁步核(Lockstep Core)功能及其故障注入自检机制。锁步核通过主核和检查核同步执行指令,并比较输出结果来检测硬件故障。文章详细阐述了锁步核的工作原理、使能配置方法以及故障注入自检的实现过程。故障注入测试通过专用寄存器LCLTEST触发,系统会定期自动测试比较器节点,验证锁步核的故障检测能力。当检测到异常时,会触发SMU模块的警报机制。该技术为汽车电子系统提供了重要的功能安全保障。

initiallizer的博客 920

项目管理 Agent:进度追踪与风险预警 Harness

我们先从LangChain的Agent定义说起:Agent是一个能感知环境、自主决策、调用工具、执行动作、迭代反思的智能实体。而「项目管理全自主Agent」,就是把Agent的核心能力和项目管理的五大过程组(启动、规划、执行、监控、收尾)深度结合,聚焦执行监控阶段的两个核心痛点:进度偏差自动化计算、风险信号自动化识别与预警的专门化Agent。全感知(Omnisensing):能从。

AI架构师小马 515

算法之动态规划总结(11种DP类型,70道全部搞懂)

简介 参考文章,将所有的DP问题分成11大类,本文将这些题目的解法进行探讨。所有题目均来自leetcode。 题目 1、线性 DP 最经典单串: 最长上升子序列 最经典双串: 最长公共子序列 经典问题: 三角形最小路径和 最大子序和 乘积最大子数组 鸡蛋掉落(DP+二分) 俄罗斯套娃信封问题 打家劫舍系列: (打家劫舍3 是树形DP) 打家劫舍 打家劫舍 II 股票系列: 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 买卖股票的最佳时机 IV

pl0321的博客 13万+

BLDC&PMSM电机控制器硬件设计工程(一)概述&需求&规划

这里是一个专注于电机控制器硬件工程的开放社区与知识仓库。我们的核心使命是分享、交流与共创,致力于解开无刷直流电机(BLDC)和永磁同步电机(PMSM)中、大功率控制器硬件设计,包括驱动IC选型,电流传感器选型,控制IC,母线电容计算,功率模块(IGBT、MOS管)选型以及大功率功率模块驱动电源设计。功率等级: 重点关注中等功率(如500W-10kW) 并向大功率(10kW以上) 延伸,探讨对应的功率器件(如MOSFET, IGBT, SiC)选型与驱动。

小幽余生不加糖 637

动态规划算法(DP)

    校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决,巴拉巴拉。说的还是很详细的,然而代码并不能看懂,毕竟    人生苦短,我用python下面就先给大家举一些详细的...

那什 5万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

★动态规划(DP算法)详解

动态规划(DP算法)详解

qq_17807067的博客 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【DP专辑】ACM动态规划总结

动态规划一直是ACM竞赛中的重点

cc_again的专栏 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

动态规划 dp算法

此处以求最小值为例✅ 状态定义:dp[i][j] = 将区间 [i,j] 合并成一段的最小代价✅ 转移方程:对于每个断点k,尝试将区间[i,j]分割成[i,k],[k+1,j]两端进行合并,则dp[i][j] = 区间[i,j]经过某种构造操作后的最大值(最小值)✅ 状态定义:dp[i][j] 表示将区间 [i,j] 转化为合法结构(如合法括号、回文)的最小代价(如删除次数)✅ 转移方程:情况1 s[i]==s[j] dp[i][j]=dp[i+1][j-1]情况2 s[i]!

scsdvsvf的博客 1200

算法竞赛备赛——【动态规划DP】线性DP

DP(动态规划)全称Dynamic Programming,是运筹学的一个分支,是一种将复杂问题分解成很多重叠的子问题,并通过子题的解得到整个问题的解的算法。基本步骤确定状态,一般为“到第i个为止, x为i (x为k) 的方案数/最小代价/最大价值”,可以根据数据范围和复杂度来推理确定状态转移方程,即从已知状态导到新状态的方法,并确保按照这个方向一定可以正确地得到最终状态。根据状态转移的方向来决定使用迭代法还是递归法 (记忆化)确定最终状态并输出。

2302_79975436的博客 2612

AcWing算法学习笔记:动态规划(背包 + 线性dp + 区间dp + 计数dp + 状态压缩dp + 树形dp + 记忆化搜索)

若体积从小到大进行遍历,当更新f[i, j]时,f[i - 1, j - vi] 已经在更新f[i, j - vi]时被更新了。因此体积需要从大到小进行遍历,当更新f[i, j]时,f[i - 1, j - vi] 还未被更新。并枚举每一个数字,若以该数字结尾的序列,其倒数第二个数字应该是小于该数字的最大的数。更新状态时,记录每一位子串是由哪一位结尾的子串转移而来的。将f[i]与f[i - 1]轮流交替使用数组进行存储。枚举每一个分组内的物品,进行01背包的选法策略。由于不存在01背包中的更新覆盖的情况。

一只可爱的小猴子的博客 1659

c++ 算法之动态规划—— dp 详解

dp 是 c++ 之中一个简单而重要的算法,每一个 OIer 必备的基础算法,你知道它究竟是什么吗?

zhhg0123的博客 2979

算法模板——动态规划(未完待更)

动态规划1 背包问题九讲1.1 0-1背包、满包1.2 完全背包1.3 多重背包1.4 混合背包1.5 二维费用背包3.6 分组背包1.6 有依赖的背包问题1.7 泛化物品1.8 背包问题问法的变化1.9 Reference 1 背包问题九讲 1.1 0-1背包、满包 有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。 ...

Aries_young的博客 702

【算法模板】动态规划(基础DP篇)

将过去和羁绊全部丢弃,不好吝惜那为梦想留下的泪水。 ——路飞

小宝的博客 3084

dp算法入门(闫氏dp分析法)

dp即是动态规划,是一种把问题分成若干个有关联的子问题来求解复杂问题的方法。dp常常适用于有重叠的子问题和最有子结构性质的问题(★ dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems.)简单来说,dp就是将复杂问题分成小问题然后表示每种问题的‘状态’并加以计算。

m0_72400354的博客 4551

【算法】动态规划专题⑫ —— 环形区间DP python

环形区间动态规划(Circular Interval Dynamic Programming)是传统区间DP的一种扩展,它处理的问题场景中输入数据或问题结构呈现环状。 这意味着第一个元素和最后一个元素是相邻的,形成一个闭合的圈。这种特性使得一些原本适用于线性序列上的区间DP技术需要进行适当的调整才能应用到环形结构上。

查理零世的博客 1698

【算法】一文带你从浅至深入门dp动态规划

还在为解不出dp动态规划的题目而苦恼吗?本文将带你从浅至深入门dp动态规划

做技术人 · 产优质博客 · 找好工作 1656
上一篇: 一些常用的网站
下一篇: AtCoder | ARC064 | 题解
Averyta
博客等级 码龄7年 1粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值