换根dp

STM32F429+LAN8720实战:5分钟搞定LWIP裸机网络通讯(附完整代码) 本文详细介绍了如何在STM32F429微控制器上,结合LAN8720 PHY芯片,在裸机环境下快速部署和配置LWIP协议栈以实现网络通讯。内容涵盖硬件RMII接口连接、STM32CubeMX关键配置、代码移植与定制,以及常见问题排查方法,帮助工程师在资源受限的嵌入式系统中高效实现稳定的以太网功能。 阅读详情

换根dp

树形 d p dp dp的一个内容,对于有根树的 d p dp dp值可以 O ( n ) O(n) O(n)求的题目,而要求考虑无根树的方法。

方法比较简单,下面来看一道例题POJ3585

题目描述

有一个树形的水系,由 N-1 条河道和 N 个交叉点组成。

我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边。

每条河道都有一个容量,连接 x 与 y 的河道的容量记为 c(x,y)。

河道中单位时间流过的水量不能超过河道的容量。

有一个节点是整个水系的发源地,可以源源不断地流出水,我们称之为源点。

除了源点之外,树中所有度数为 1 的节点都是入海口,可以吸收无限多的水,我们称之为汇点。

也就是说,水系中的水从源点出发,沿着每条河道,最终流向各个汇点。

在整个水系稳定时,每条河道中的水都以单位时间固定的水量流向固定的方向。

除源点和汇点之外,其余各点不贮存水,也就是流入该点的河道水量之和等于从该点流出的河道水量之和。

整个水系的流量就定义为源点单位时间发出的水量。

在流量不超过河道容量的前提下,求哪个点作为源点时,整个水系的流量最大,输出这个最大值。

题解

考虑若为有根树(默认 r o o t = 1 root=1 root=1),设 g [ u ] g[u] g[u]表示以 u u u为根的子树中的最大值,考虑儿子节点 v v v,设 d [ u ] d[u] d[u]表示 u u u的度数。

  1. 若 d [ v ] = 1 d[v]=1 d[v]=1,则 g [ u ] + = w u , v g[u]+=w_{u,v} g[u]+=wu,v​
  2. 若 d [ v ] > 1 d[v]>1 d[v]>1,则 g [ u ] + = m i n ( w u , v , g [ v ] ) g[u]+=min(w_{u,v},g[v]) g[u]+=min(wu,v​,g[v])

如此枚举每个点作为根节点,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

设 f [ u ] f[u] f[u]表示以 u u u为根节点的答案的最大值设 v v v为与 u u u相连的边
考虑换根( u − > v u->v u−>v)后有哪些不变值,显然 g [ v ] g[v] g[v]没有发生改变
考虑从已知向未知转移:

  1. f [ u ] = g [ u ]    u = 1 f[u]=g[u] ~~ u=1 f[u]=g[u]  u=1
  2. 若 d [ u ] = 1 d[u]=1 d[u]=1,那么 f [ v ] = g [ v ] + w u , v f[v]=g[v]+w_{u,v} f[v]=g[v]+wu,v​
  3. 若 d [ u ] ! = 1 d[u]!=1 d[u]!=1,那么 f [ v ] f[v] f[v]应该为 g [ v ] g[v] g[v]加上从 v v v的上面那一坨(从 u u u过来的子树部分),那么有
    f [ v ] = g [ v ] + m i n ( f [ u ] − m i n ( g [ v ] , w u , v ) , w u , v ) f[v]=g[v]+min(f[u]-min(g[v],w_{u,v}),w_{u,v}) f[v]=g[v]+min(f[u]−min(g[v],wu,v​),wu,v​)

时间复杂度为 O ( n ) O(n) O(n)

代码:

/*******************************
Author:galaxy yr
LANG:C++
Created Time:2019年08月30日 星期五 20时29分21秒
*******************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int T,n,ans,d[maxn],f[maxn],g[maxn],head[maxn],cnt;
struct edge{
    int to,next,w;
}e[maxn<<1];
struct IO{
       template<typename T>
               IO & operator>>(T&res)
               {
                      char ch=getchar();
                      T q=1;
                      while(ch<'0' or ch>'9'){if(ch=='-')q=-q;ch=getchar();}
                      res=(ch^48);
                      while((ch=getchar())>='0' and ch<='9')
                      res=(res<<1)+(res<<3)+(ch^48);
                      res*=q;
                      return *this;
              }
}cin;
void add(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].next=head[u];
    e[cnt].w=w;
    head[u]=cnt;
}
void clear()
{
    ans=cnt=0;
    memset(d,0,sizeof d);
    memset(head,0,sizeof head);
}
void dfs(int now,int fa)
{
    g[now]=0;
    for(int i=head[now];i;i=e[i].next)
        if(e[i].to!=fa)
        {
            dfs(e[i].to,now);
            if(d[e[i].to]==1)
                g[now]+=e[i].w;
            else 
                g[now]+=min(g[e[i].to],e[i].w);
        }
}
void dp(int now,int fa)
{
    for(int i=head[now];i;i=e[i].next)
        if(e[i].to!=fa)
        {
            if(d[now]==1)
                f[e[i].to]=g[e[i].to]+e[i].w;
            else
                f[e[i].to]=g[e[i].to]+min(f[now]-min(e[i].w,g[e[i].to]),e[i].w);
            dp(e[i].to,now);
        }
    return;
}
int main()
{
    //freopen("p3585.in","r",stdin);
    //freopen("p3585.out","w",stdout);
    cin>>T;
    int u,v,w;
    while(T--)
    {
        cin>>n;
        clear();
        for(int i=1;i<n;i++)
        {
            cin>>u>>v>>w;
            add(u,v,w);add(v,u,w);
            d[u]++;d[v]++;
        }
        dfs(1,0);
        f[1]=g[1];
        dp(1,0);
        ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,f[i]);
        printf("%d\n",ans);
    }
    return 0;
}

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南 本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。 阅读详情

相关推荐

微信小程序消息推送实战:从模板消息到订阅消息的进阶指南

本文详细解析了微信小程序消息推送的核心机制,重点对比了模板消息与订阅消息的差异与应用场景。模板消息适用于支付成功等强即时性业务回执,而订阅消息则需用户授权,更适合物流提醒等可预期通知。文章提供了从授权、配置到发送的完整实战指南,并分享了常见的避坑技巧与性能优化建议,帮助开发者构建高效、合规的用户触达体系。

weixin_29231027的博客 594

【学习笔记】详解换根法(换根DP)

【学习笔记】详解换根法(换根DP)

weq2011的博客 6245

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

树形dp——换根dp

通过观察,我们发现,右边的深度减少了,左边的增加了,减少的节点为未换根之前以0为根节点经过2的所有路径上的节点,增加的为没有经过2的。我们假设某个节点为根,将无根树化为有根树,在搜索dfs统计子树的深度和,则可以用一次搜索算出以该节点为根时的深度和,其时间复杂度为。就表示为上升的深度,不经过child的子节点树都增加,不经过的节点数目就是从节点数目减去经过的节点数目。如图,我们的根节点就是0,接下来我们选取子节点2作为新的根节点,对其进行换根。但这样求解出的答案只是以该节点为根的,并不是最优解。

m0_74176921的博客 860

实测对比:DJI O3、Walksnail Avatar、HDZero三大高清图传,谁才是低延迟王者?

本文对DJI O3、Walksnail Avatar V2和HDZero三大高清图传系统进行了实测对比,重点分析其在FPV飞行中的低延迟表现。通过专业测试环境和量化数据,揭示HDZero在原生低延迟架构上的优势,DJI O3在画质与延迟间的平衡,以及Walksnail的动态码率调整特点,为不同场景下的选购提供决策依据。

weixin_30756499的博客 444

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 713

动态规划:(2):树形dp与换根dp

本文介绍了树形动态规划(DP)的基本概念和应用场景。首先通过一道热身题展示了树结构问题的解题思路,随后详细讲解了树形DP的实现方法,包括状态转移方程设计和递归求解过程。文章还介绍了换根DP技术,用于求解以所有节点为根的最优解问题,并通过例题演示了如何利用子树信息优化计算。最后,作者总结了树形DP的核心思想,并强调通过具体例题理解抽象算法的学习方法。全文以通俗易懂的方式呈现了树形DP的基本框架和典型应用。

jzoj_ylz的博客 1295

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

换 根 dp

1.首先 dfs1 得到每个节点子树的节点个数,然后得到dp[1](以1节点为根的答案),dp[子]=dp[父] - size[子] + n - size[子] 得到其相邻子节点的答案。2.假设以u为根节点的收益是dp[u],如果以v为根节点,对于以u为根,r染色v时收益增加n-size[v];2.设置sum数组:固定某个节点为根节点(比如下图以1为根节点),各节点到其子树所有节点的距离和,得到sum[1],就是dp[1]用下题引入换根dp:简而言之换根dp就是通过父节点的答案得到相邻子节点的答案。

2301_80275822的博客 403

蓝牙学习笔记之HCI协议(一)

目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet HCI Event Packet HCI命令和事件介绍 Inquiry command Write Local Name Command Read BD_ADDR Command H...

在云巅的博客 2万+

基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)(235)

基于STM32设计的老人摔倒检测报警系统,不仅能够实时监测老人的位置信息,方便在紧急情况下快速定位,还能通过陀螺仪模块精确检测老人的身体姿态,一旦判断为摔倒状态,系统将立即触发蜂鸣器报警,并通过4G网络向指定联系人发送短信警示,确保老人能够迅速得到援助。此外,系统还支持老人主动按下设备上的按键发送求助短信,增强了系统的灵活性和实用性。

4690

换根DP入门

简述 换根DP是一类特殊的树形DP。 在解题过程中,存在一类树上问题,要求我们求解每个节点做为根节点的时的一些数据的问题。朴素算法一般是O(n2)O(n^2)O(n2)地进行n次dfs。遇到这种问题时,我们可以通过考察根节点转移到相邻节点时的影响,从而得出状态转移方程,进而O(1)O(1)O(1)地转移根节点得到新的答案。最后达到将问题总的复杂度降到O(n)O(n)O(n)的目的。 问题引入 给定一棵n个节点无向树(n个节点,n-1条无向边的连通图),要求选出一个节点,使得该节点做为根节点时,所有节点的深度

Arctic_Clam的博客 1246

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

天天酷科研的博客 506

换根dp小结

前言 这个东西据说(听师兄说)是这次 CSP−SCSP-SCSP−S 最后一题的题解做法,虽然还没去钻研那题,但是姑且算是把这个东西学会了。 思路 首先这是个在树上用的东西,一般就是不告诉你哪个点作为根,而你就需要求出所有点作为根时的答案,然后才能得到最终的答案。 思路也不是什么很神奇的东西:就是一开始先固定一个点作为根,然后 dpdpdp 一次求出解,然后利用这个解再做一次 dpdpdp——这次...

a_forever_dream的博客 1895

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

换根 DP 简介

● 换根 DP 通常遵循一个固定的两遍 DFS 流程

hnjzsyjyj的专栏 1169

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

树上dp之换根dp

换根dp是树上dp的一种我们在什么时候需要用到换根dp呢?当题目询问的属性,是需要当前结点为根时的属性,这个时候,我们就要使用换根dp换根dp的基本思路:假设题目询问的的属性为x通常我们会进行两次dfs第一次dfs,我们选取任意一个结点作为给出的无根树的根,对其进行dfs,并求出这个根的x,以及一些其他辅助数组(即节点与其子树的一些属性关系)第二次dfs,我们记dp[i]为对于结点i而言,节点i作为树的根时,我们要求的属性x。

Se_ren_di_pity的博客 1392

【算法】换根DP

834. 树中距离之和。

小威的博客 1229

集训DAY8之树形 DP与换根DP

树形动态规划(Tree DP)是动态规划在树结构上的具体应用,它充分利用了树的递归特性和层次结构来设计高效的求解策略。作为无环连通图,树的特殊性质为动态规划提供了天然的计算框架。在树形 DP 中,我们通常将问题分解为子树问题:对每个节点计算状态值,然后根据父子关系将这些状态值向上传递。这种自底向上(后序遍历)或自顶向下(前序遍历)的计算方式,与树的遍历顺序完美契合。状态定义通常与子树信息密切相关状态转移依赖于子节点的状态无环特性避免了循环依赖问题计算顺序由树的遍历顺序决定。

Liyankai1523900的博客 845

【动态规划 & 树形DP】树的换根DP(换根DP模板)

树形 DP 中的换根 DP 问题又被称为二次扫描,通常不会指定根结点,并且根结点的变化会对一些值,例如子结点深度和、点权和等产生影响。所谓换根DP,就是基于原有的状态,通过相邻节点进行转换后,现有的状态仅仅只需要进行微小的变动即可达到完美相邻状态间的切换。通常需要两次 DFS,第一次 DFS 预处理诸如深度,点权和之类的信息,在第二次 DFS 开始运行换根动态规划。那么考虑完了两个根节点之间状态的转变,根相邻节点的状态应该如何变化?的相邻节点,这些点的树高状态并不会改变,读者可以自己思考。

Cauchy的博客 1527

换根 DP:进阶练习笔记

观前提醒:本文非新手向文章,不建议作为换根 DP 入门使用。 换根 DP 是树状 DP 的一种,思维难度较高,但是学会以后很套路也很轻松。 主要步骤: + 第一次 DP(固定根) + 求解以某一个固定点为根时的子问题 + 同时可以顺便求出其它需要用到的数据 + 第二次 DP(换根) + (临时)消除该子节点对父节点的贡献 + 将这个父节点的贡献合并到子节点上

Jerrycyx的博客 1009

树形dp换根

换根解决的是“不定根”的树形dp问题。该类题目的特点是:给定一个树形结构,需要以每个节点为根进行一系列统计。 方法为两次扫描来求解: 第一次扫描时,任选一个点为根,在“有根树”上执行一次树形dp,在回溯时,自底向上的状态转移。 第二次扫描时,从第一次选的根出发,对整根树执行一个dfs,在每次递归前进行自顶向下的转移,计算出换根后的解。 题目: 有一个树形的水系,由 N-1 条河道和 N 个交叉点组...

weixin_44316314的博客 2229

换根dp入门

模板题 题目大意 本题是要你任选一个点为根使得树上的所有点深度之和最小。 题目思路 本题是要你任选一个点为根使得树上的所有点深度之和最小。 首先考虑如果是指定根节点你会不会做:已知根节点的话,我们只需要一遍dfs(或者bfs)就可以求出每个点的深度,然后求和就可以了。 然后我们考虑如果我们知道当前节点x为根的结果能否快速求出以它某儿子y为根的结果——当y从根的儿子变成根,它和它的子树都向上提了一层,深度-1,而x往下了一层,它除了y以外的其他子树也一起往下了一层,深度加以。所以从以x为根变为以y为根,深度之

hunxuewangzi的博客 1703

换根 dp

那么就会出现重复计算的情况。注意:换根时要注意第一次。的部分,此时如果直接将。

m0_72761451的博客 740

树形dp<1>——换根dp

换根dp

seanli1008的博客 1006

换根dp题集

题目链接 题意:给你一棵树,按顺序输出以每个顶点为根节点,到任意点的边权和最大,输出这个最大值。 思路:换根dp,两遍dfs,第一个dfs求出以这个点为根节点,子树的最大边权值,保存在d数组中。第二个dfs1,首先算出以u节点为根节点的dp值,保存在ans数组里,然后求出u节点的儿子的前缀dp值保存在suf数组中,再求出u节点儿子的后缀dp值保存在x中,那么换根后的u节点的dp值,d【u】=...

我是蒋卫升呀~ 1117
上一篇: FWT通俗的想法
下一篇: 邻接链表(前向星)存图
Galaxy_yr
博客等级 码龄8年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值