算法 | 动态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])�∈[�−���(⌊�/�[�]⌋,�[�]),�]) 阅读详情

相关推荐

避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节

本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。

weixin_42741930的博客 246

动态DP入门&线性动态DP

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

RBS的专栏 2132

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9949

【动态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

爬虫风控实战:当你的代理IP被数美滑块盯上时,如何优雅破解?

本文深入探讨了爬虫风控对抗中数美滑块验证码的破解与防御策略。通过分析数美滑块的多层防御机制,提出了代理IP池精细化管理、请求特征拟人化改造以及工程化滑块验证解决方案等系统性方法,帮助开发者有效降低验证码触发率,提升爬虫效率。

weixin_27419879的博客 207

kmeans聚类分析结果怎么看_【Stata与机器学习】物以类聚-KMeans算法应用案例介绍...

古语有云:物以类聚,人以群分。KMeans是无监督机器学习中的聚类算法中最简单的一种——基于特征对样本进行归为不同的类,很好地阐述了‘物以类聚’这句话的精髓。机器学习又叫统计学习。既然都统计了,所以当然包括了计量经济学。所以一般来说,机器学习的算法类型远多于计量经济学。比如线性回归,这个算是机器学习算法中比较基础的部分。当然,计量经济学在回归分析、因果推断方面的造诣,也是普通机器学算法所不能比的。...

weixin_39857480的博客 1万+

动态dp(ddp)

详细讲解动态dp。

wanglianda2007的博客 709

Cursor+Playwright MCP实现UI全自动化,告别繁琐元素定位!

摘要:本文探讨了利用Cursor和PlaywrightMCP实现UI自动化测试的创新方法。通过将AI编程助手与浏览器自动化技术结合,解决了传统UI自动化测试中元素定位繁琐、维护成本高等痛点。文章详细介绍了项目架构设计、AI使用技巧(包括精准提问和编写.mdc规则文档),以及如何实现自然语言测试用例到自动化脚本的转换。最终实现了测试人员只需输入手工测试步骤,AI即可自动生成完整测试代码的智能化流程,并展望了通过Excel表格一键生成测试用例的未来发展方向,为UI自动化测试提供了高效解决方案。

baidu_29774881的博客 2794

动态规划【DP】详细解释

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

Chey_LER_SLC的博客 2235

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 285

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5702

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

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

pl0321的博客 13万+

Windows 11 安装 Miniconda + Mamba,配置国内源

本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3345

动态规划算法(DP)

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

那什 5万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

动态规划(DP算法)详解

qq_17807067的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

cc_again的专栏 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

动态规划 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、付费专栏及课程。

余额充值