树覆盖型dp

news/2024/10/24 12:55:31

遇到做过的题不会做,以后要好好改题 😦

\(\color{blue}\textbf{[例题]}\)
ZRtes AB day1 t3
2022syzx夏季训练4
poj#2152 fire

模型 #basic

在树上选择若干个点,每个点能覆盖个离自己距离不大于某个值的所有点,问一系列最优化(计数不行)问题

设
f[i][j]表示目前已经做完了i的子树,且钦定i要么不被覆盖,要么被j覆盖的情况下
获得的最大最小值
best[i]表示某一个点的最优值
转移则考虑对于u枚举他被谁覆盖了,然后考虑如何去除多算的i的
费用,那么就有f[u][i]+=min\max(best[v],f[v][i]-w[i]),这
样就是相当于把给i的钱强制在树根u被计算,可能转移的时候发现
不连续,但是由于最优答案的性质,所以计算的答案被包含best里头
了因此不用分类讨论
//[zr AB day1 t3]
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch))f^=ch=='-',ch=getchar();while(isdigit(ch))x=x*10+(ch^48),ch=getchar();return f?x:-x;
}
const int N=1005,inf=1e18;
int dis[N][N],a[N],f[N][N],best[N],n,t,d,s;
vector<pair<int,int>> G[N];
void dfs1(int u,int fa,int rt){for(pair<int,int> v:G[u])if(v.first!=fa){dis[rt][v.first]=dis[rt][u]+v.second;dfs1(v.first,u,rt);}
}
void dfs2(int u,int fa){for(pair<int,int> v:G[u])if(v.first!=fa){dfs2(v.first,u);}for(int i=1;i<=n;++i){f[u][i]=(dis[u][i]<=d?a[u]:0)-s;for(pair<int,int> v:G[u])if(v.first!=fa){f[u][i]+=max(best[v.first],f[v.first][i]+s);}}for(int i=1;i<=n;++i){best[u]=max(best[u],f[u][i]);}
}		
signed main(){n=read(),t=read(),d=read(),s=read();for(int i=1;i<=n;++i)a[i]=read()*t;for(int i=1;i<n;++i){int x=read(),y=read(),z=read();G[x].push_back({y,z});G[y].push_back({x,z});}for(int i=1;i<=n;++i)dfs1(i,0,i);dfs2(1,0);printf("%lld\n",best[1]);return 0;
}
[fix]
关于best的作用:
其实发现定义的状态非常神奇:
每个点要么不被覆盖,要么强制被i覆盖,那么就会出现这种情况:
我钦定了u被很远的一个点控制,但是u的儿子v被很近的一个点控制
然后很远的这个点无法覆盖u,但是很近的这个点能够覆盖u,但是
由于我钦定了u被远点覆盖,因此在这种情况下没有贡献,并不合法
但是如果出现了这种情况,那么一定存在合法的状态比当前这个状态
的值更优,因此best里头就不会有这种非法的状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

P5663 [CSP-J2019] 加工零件 题解

最短路对于上图,如果我们相知道 $2$ 号工人想要一个 $3$ 阶段的零件,其实是看 $2$ 到 $1$ 有没有一条长度为 $3$ 的路径.但如果要求 $4$ 阶段的路径,那就不一定了. 所以我们直接求一遍最短路,分奇最短路和偶最短路. 处理完后,最后一次 $\Theta (1)$ 的回答,如果路径长度过…

报error:0308010C:digital envelope routines::unsupported错--nodejs版本过高(nvm安装(更换)不同版本nodejs)

最近小编入职实习,运行(npm run dev)前端项目时报error:0308010C:digital envelope routines::unsupported的错,一查发现原来是nodejs版本过高,与项目不匹配。接下来介绍更换nodejs版本的方法。 第一种:官网下载通过nodejs官网下载安装 ,但有个缺陷,不同版本的nodejs无法顺…

学习笔记(一):创建页面

方法一: 打开“entry > src > main > ets ”,右键点击“pages”文件夹,选择“New > ArkTS File”,命名新的页面。可以看到文件目录结构如下:注意:此种方法还需要手动配置页面路径: 打开“entry > src > main > resources > base > profile”…

修改eip

一、eip 1、eip中存储了一个决定cpu下一行执行什么代码的地址,若想改变cpu的行为就修改eip寄存器 二、JMP指令(修改eip) 修改eip为4183FD,cpu自己跳转到相应位置SHORT是跳转的位置离它所在的位置小于128字节会自动加上的,大于则没有执行之后寄存器和堆栈都没有变化,只有…

Windows 调试工具课程——在软件万种死法中调试出原因

参考:https://blog.lindexi.com/post/Windows-%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7%E8%AF%BE%E7%A8%8B.html本文是我在集团内部上的课程记录而成的博客内容。在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路。适合于伙伴们入门 Windows…

docker以及docker-compose 离线安装

一、离线安装docker1.下载离线包去官网下载离线包https://download.docker.com/linux/static/stable/ 我这里下载的是X86_64的包, 2.安装dockersudo tar zxvf docker-20.10.13.tgz 将docker目录下面的文件全部拷贝到/usr/bin/sudo cp -p docker/* /usr/bin将docker注册为系…

实现CJ188转profinet IO项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关 2 5 用PROFINET IO协议转发数据 5 6 案例总结 7 1 案例…

RAW 转换器推荐:Capture One Studo 中文激活版

Capture One Studio是一款专为摄影师设计的强大图像处理软件,它以其卓越的RAW格式处理能力和精准的色彩控制而闻名。该软件提供了丰富的编辑工具,使用户能够轻松调整曝光、对比度、色彩平衡等参数,同时支持多种相机型号的RAW文件格式,确保完美处理各类摄影作品。Capture On…