首页 > 其他分享 >动态DP小记

动态DP小记

时间:2023-09-25 14:35:18浏览次数:47  
标签:重链 max son 子树 DP 动态 dp 小记

前言

矩阵乘法优化DP,重链剖分。

涉及到的知识点是比较复杂的,但是比较重要。

这是猫锟在 WC2018 讲的黑科技,一般用来解决树上的带有点权(边权)修改操作的 DP 问题,为了普及,甚至 CSP2022-S T4 考到了此知识点。

做法

朴素DP

设 \(dp_{i,0}\) 表示不选 \(i\),\(i\) 的子树的最大权独立集的权值大小。
\(dp_{i,1}\) 表示选 \(i\),\(i\) 的子树的最大权独立集的权值大小。
则有:

\[dp_{i,0}=\sum\limits_{x=1} \max\{dp_{x,0},dp_{x,1}\}\\ dp_{i,1}=\sum\limits_{x=1} dp_{x,0}+a_i \]

最后答案 \(ans=\max\{dp_{1,0},dp_{1,1}\}\)。

但显然,这个式子如果带修没法跑,复杂度会炸掉,要继续优化。

重链剖分

我们使用重剖优化带修的部分,可以在 \(\Theta(\log^2n)\) 的复杂度下实现单点修改。

将这棵树剖分后,假如有这样一条重链:

设 \(g_{i,0}\) 表示不选择 \(i\) 且只允许选择 \(i\) 的轻儿子所在子树的最大答案,

\(g_{i,1}\) 表示不考虑 \(son_i\) 的情况下选择 \(i\) 的最大答案,

\(son_i\) 表示 \(i\) 的重儿子。

则刚才的方程就简化为:

\[dp_{i,0}=g_{i,0}+\max\{dp_{son_i,0},dp_{son_i,1}\}\\ dp_{i,1}=g_{i,1}+dp_{son_i,0} \]

最后答案 \(ans=\max\{dp_{rt,0},dp_{rt,1}\}\)。

然后我们现在要考虑如何在线段树内 \(\Theta(1)\) 的修改与查询。

矩阵乘法

我们发现这可以用矩阵乘法优化。

标签:重链,max,son,子树,DP,动态,dp,小记
From: https://www.cnblogs.com/code-ac/p/17727863.html

相关文章

  • 深入理解ThreadPoolExecutor
    在上节介绍ThreadPoolExecutor时,大部分参数中都很简单,只有workQueue和handler需要进行详细说明。队列参数workQueue指被提交但未执行的任务队列,它是一个BlockingQueue接口的对象,仅用于存放Runnable对象。根据队列功能分类,在ThreadPoolExecutor的构造函数中可使用以下......
  • Codeforces463-E.Team Work-组合数、DP
    Codeforces463-E.TeamWork题意:求\[\sum_{i=1}^n\binom{n}{i}i^k\]其中\(1\leqn\leq10^9\),\(1\leqk\leq5000\)。题解:其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据\(k\)去递推了。首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函......
  • 【C语言菜鸟知识】——动态内存管理
    --------------------------------------------------------------------------------------------------------------------- 1、栈在全局变量是分配在内存中的静态储存区,非静态的局部变量是分配在内存中的动态储存区,这个储存区就是栈的区域。2、堆在内存中允许建立内存动态分......
  • Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
    一、前言之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖,然后又能实现推拉流呢,当然有的那就是udpp推流,其中udp推流还可以是组播或者单播推流,组播一般会选择224.0.0.1这个地址......
  • dleeeor()确定加载动态库时缺少的符号
       [plugins_open_pluginplugins.c:79]1970-01-01T17:46:22Z|00003|plugins|INFO|netdev_registernotsupportedby/var/lib/plugins/libacl_pluginplugin[plugins_open_pluginplugins.c:83]1970-01-01T17:46:22Z|00004|plugins|INFO|ofproto_registernotsupported......
  • 数位dp
    d数位dp#include<iostream>#include<cstring>#include<algorithm>#include<string>#include<cmath>#include<vector>usingnamespacestd;constintN=17;typedeflonglongll;constllINF=1e17;llf[N][10];voi......
  • C语言动态内存分配
      #include<iostream>#include<stdio.h>int*removeDuplicates(intnumsSize){//malloc是常用的动态内存分配int*arr=(int*)malloc(numsSize*sizeof(int));returnarr;}intmain(){intnumsSize=10;int*arr;a......
  • 状压DP合集
    目录2023百度之星初赛三-1石碑文[ABC318-]2023百度之星初赛三-1石碑文[ABC318-]......
  • Rust 静态分发和动态分发
    首先定义两个结构体Dog和Cat分别实现AnimaltraittraitAnimal{fnspeak(&self);}structDog;implAnimalforDog{fnspeak(&self){println!("旺旺.....");}}structCat;implAnimalforCat{fnspeak(&self){......
  • [转]Websocket 底层是 TCP 还是 UDP?白话版解析 TCP 和 UDP 传输过程
    原文地址:Websocket底层是TCP还是UDP?白话版解析TCP和UDP传输过程-掘金写在前面在前面陆陆续续写了好几篇数字孪生相关的文章,而其中所涉及的一个其他项目比较不常使用的技术,网络通讯协议Websocket,这个协议主要用于服务器定时向客户端推送数据,相比HTTP更加适合数字......