首页 > 其他分享 >动态 DP - 知识点梳理

动态 DP - 知识点梳理

时间:2023-08-16 15:46:05浏览次数:33  
标签:知识点 矩阵 转移 修改 相乘 动态 梳理 DP

DP 用于解决多阶段性决策性问题,方法是每个阶段分开转移,各个阶段转移是独立的,不会影响到其他阶段的转移。因此,整个 DP 的过程其实就是原始数据(即边界)顺次按照阶段转移,最终成为答案。
矩阵代表着一种线性变换,矩阵的乘法其实就是变换的合成,所以我们可以将 DP 每个独立阶段的转移抽象为一个矩阵,原数据抽象(边界)为一个向量,转移的过程就是向量依次与矩阵相乘的过程。
注意当矩阵二元运算具有结合律和交换律时,矩阵的乘法也具有结合律。所以我们可以先将所有转移过程相乘,合并为同一个矩阵,代表着整个转移过程,然后再直接将数据与该矩阵相乘。
这样的好处非常明显:每次更换初始值时不必再重新将数据再一步一步转移,而是直接乘一遍就好了。
而且我们可以用线段树(甚至前缀和,如果有逆元)来维护矩阵的乘积,这意味着现在天生支持修改矩阵,也就是转移步骤,可以在 \(O(1)\) 之内求出修改转移后的新的答案。
这就是动态 DP,它支持多次修改转移过程并求答案。

例题

Luogu P4719 【模板】"动态 DP"&动态树分治
先考虑不带修的做法。其实就是 Luogu P1352 没有上司的舞会,设状态 \(f_{i,0/1}\) 代表第 \(i\) 个节点选或不选时其子树的答案。转移为
\(\begin{aligned} f_{i, 0} = \sum\max \{f_{j, 0}, f_{j, 1}\}\\ f_{i, 1} = w_i + \sum f_{j, 0} \end{aligned}\)
修改时,只有点 \(x\) 至点 \(1\) 的路径上的点的 \(f\) 值会更新,于是我们只需要从 \(x\) 节点往上爬,更新这条链上的 \(f\) 值即可。
但这种方法时间复杂度没有保证(题暴力能过),因为树的深度没有保证。
其实每次修改时,只是一个地方的转移方式改变了一点(就 \(w_i\) 变成了新的值),我们却要将整条链所有转移都重算一遍,这就浪费了时间。这种情况和动态 DP 能优化的情况刚好相同,因此尝试使用动态 DP 进行求解。
但是现在的转移方式并不能抽象成一个矩阵,因为每个点上的转移涉及到其所有子节点,矩阵的维度会非常大。

标签:知识点,矩阵,转移,修改,相乘,动态,梳理,DP
From: https://www.cnblogs.com/mindeveloped/p/dddddddddddddddp.html

相关文章

  • DPDK 22.11.2 使用建议
    驱动建议使用vfio-pci,依赖系统的vfioigb_uio从DPDKv20.02开始禁止编译。可以通过CONFIG_RTE_EAL_IGB_UIO打开编译。igb_uio计划迁移到其他项目。uio_pci_generic是linux系统提供的,不支持virtualfunction(VF)。如果想支持virtualfunction(VF),请使用igb_uio,依赖系统的uio。......
  • 2023下半年产品经理国际认证NPDP8月19日线上开班
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。  【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业......
  • dp递推 口胡记录
    dp/递推口胡记录[SHOI2013]超级跳马\(tag\):矩阵乘法,前缀和暴力\(dp\)很显然,设\(f_{i,j}\)为从\((1,1)\)跳到\((i,j)\)的方案数,那么有$f_{i,j}=\sum\limits_{j-(2k+1)>0}f_{i/i+1/i-1,j-(2k+1)}$发现这个东西其实是一直由前面奇偶性相同的一段转移过来的,因此考虑前缀和......
  • .NET相关知识点分享一
    第一章.NETCore入门1.NET为什么要跨平台?A.安全考虑(Linux开源)B.成本原因(Windows收费)C.软件生态(服务器软件生态优先在Linux)2.NETFramework和.NETCore的区别?跨平台支持:.NETFramework:最初是为Windows平台设计的,因此只能在Windows操作系统上运行。.NETCore:专注于......
  • 树形 dp
    树形dp概念在树上做dp树形dp一般是从树的叶子节点向根的做dp,也就是自下而上做dp树上dp加差分统计记住差分,在做很多树上的统计题时,都会用到点击查看代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;constintMAXN=2e5+3;in......
  • Spring 与 Spring MVC 相关知识点回顾整合
    1.Spring框架1.1.Spring框架的作用Spring框架主要解决了创建对象和管理对象的相关问题。通过Spring创建并管理对象,可以使得开发者不再反复关心对象的创建过程,并且,默认情况下,由Spring创建的对象都是单例的,这是非常有必要的!由Spring创建的对象通常称之为SpringBean。由于Sp......
  • TCP和UDP
    一、进程间通信-socket套接字基本特征:socket是一种接口技术,被抽象了一种文件操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程之间通信(网络通信)本地进程间通信编程模型:进程A进程B创建socket对象创建sock......
  • ThingsKit物联网平台设备UDP接入
    入门介绍UDP基础知识UDP是UserDatagramProtocol(用户数据协议)的简称,是一种无连接的协议,该协议工作在OSI模型中的第四层(传输层),处于IP协议的上一层。传输层的功能就是建立“端口到端口”的通信,UDP提供面向事务的简单的不可靠信息传送服务。接下来来看UDP与TCP的区别:UDPTCP......
  • 药品的GMP、GLP、GCP、GAP、GSP、GDP、GPP、GUP
    GMP是GoodManufacturingPractice的简称,即药品生产质量管理规范。检查对象是:①人;②生产环境;③制剂生产的全过程。"人"是实行GMP管理的软件,也是关键管理对象,而"物"是GMP管理的硬件,是必要条件,缺一不可。GMP的三大要素是:①人为产生的错误减小到最低;②防止对医药品的污染和低质量医药......
  • cannot import name '_BindParamClause' from 'sqlalchemy.sql.expression'
    python3.8安装环境组件正常安装运行 flaskdbinit报错 cannotimportname'_BindParamClause'from'sqlalchemy.sql.expression' 问题原因-未知 解决方案更新alembic组件版本pipinstall--upgradealembic 问题解决 ......