【树形dp】ZOJ-3326-Tree of Tree

097634e9169c6777120550ad61afb6bc-1.jpg 立即下载

这道题和昨晚在CF上做的一道题很像,都是树形dp。刚开始时,我写了个很烂的代码水过了,时间复杂度为O(n^3).不过一看觉得不对了,人家的都是0ms的,于是去网上找题解优化,时间就降为O(n^2)了,终究还是自己太水了……

题目

优化前,300ms:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
template<class T> T Max(T x,T y){return x>y?x:y;}
template<class T> T Min(T x,T y){return x<y?x:y;}
#define N 105
vector<int> v[N];
int m,a[N],dp[N][N];
void dfs(int x,int y)
{
	int i,j,k,z,len;
	dp[x][1]=a[x];
	len=v[x].size();
	for(i=0;i<len;i++)
	{
		z=v[x][i];
		if(y==z)continue;
		dfs(z,x);
		for(j=m;j>0;j--)
			for(k=1;k<=j;k++)
				dp[x][j]=Max(dp[x][j],dp[x][k]+dp[z][j-k]);             //状态转移
	}
}
int main()
{
	//freopen("a.txt","r",stdin);
	int i,n,x,y,ans;
	while(scanf("%d%d",&n,&m)!=EOF)
	{	
		for(i=0;i<n;i++)
		{
			scanf("%d",a+i);
			v[i].clear();
		}
		for(i=1;i<n;i++)
		{
			scanf("%d%d",&x,&y);
			v[x].push_back(y);
			v[y].push_back(x);
		}	
		ans=0;
		for(i=0;i<n;i++)             //这个循环浪费了时间
		{
			memset(dp,0,sizeof(dp));
			dfs(i,-1);
			ans=Max(ans,dp[i][m]);
		}
		printf("%d\n",ans);
	}
	return 0;
}


优化后,0ms:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
template<class T> T Max(T x,T y){return x>y?x:y;}
template<class T> T Min(T x,T y){return x<y?x:y;}
#define N 105
vector<int> v[N];
int m,a[N],dp[N][N];
void dfs(int x,int y)
{
	int i,j,k,z,len;
	dp[x][1]=a[x];
	len=v[x].size();
	for(i=0;i<len;i++)
	{
		z=v[x][i];
		if(y==z)continue;
		dfs(z,x);
		for(j=m;j>0;j--)
			for(k=j;k>0;k--)             //这里是优化最关键的地方,由大到小就可以防止覆盖
				dp[x][j]=Max(dp[x][j],dp[x][k]+dp[z][j-k]);
	}
}
int main()
{
	//freopen("a.txt","r",stdin);
	int i,n,x,y,ans;
	while(scanf("%d%d",&n,&m)!=EOF)
	{	
		for(i=0;i<n;i++)
		{
			scanf("%d",a+i);
			v[i].clear();
		}
		for(i=1;i<n;i++)
		{
			scanf("%d%d",&x,&y);
			v[x].push_back(y);
			v[y].push_back(x);
		}	
		memset(dp,0,sizeof(dp));
		dfs(0,-1);
		ans=0;
		for(i=0;i<n;i++)ans=Max(ans,dp[i][m]);	
		printf("%d\n",ans);
	}
	return 0;
}



智能体式AI漫游指南中文版 智能体式AI漫游指南中文版、智能体式AI指南英文原版 立即下载

相关推荐

国央企如何利用AI工具提升科技创新项目管理与成果转化能力?.docx

国央企如何利用AI工具提升科技创新项目管理与成果转化能力?

ZOJ3201 Tree of Tree 【树形dp】

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3326 题意:在一颗树中找到大小为K的权值最大的子树 分析:典型的树形dp,转移方程dp[u][j]=max(dp[u][j],d[u][j-k]+dp[v][k]),dp[u][j]表示第u个点为子树根节点取子树大小为j的最大权值。这个方程比较好推,具体实现起来就

zxd2629546的专栏 736

融合高斯扰动与竞争学习的改进型多目标部落竞争与成员合作算法(IMOCTCM)求解DTLZ1-DTLZ7及-盘式制动器设计研究(Matlab代码实现)

内容概要:本文档名为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际内容并非聚焦于该主题,而是一份涵盖多个科研领域的Matlab/Simulink仿真资源汇总清单。文档列举了包括多目标优化算法(如IMOCTCM、MOWAA)、电力电子变换器控制(如LLC谐振变换器、DAB变换器)、电机控制(如PMSM无感控制)、状态估计(如卡尔曼滤波)、微电网调度、无人机路径规划、图像处理、信号处理等多个方向的仿真研究课题,涉及Matlab、Python、Simulink、PSCAD等多种工具和编程语言。文档末尾频繁出现“完整资源下载:公众号——荔枝科研社”及百度网盘链接,表明其核心用途是推广和分享一系列科研仿真资料,服务于学术交流与资源共享。; 适合人群:适用于电气工程、自动化、控制科学与工程、电力系统、电子信息、机械电子、计算机科学等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的Matlab/Simulink仿真案例参考和技术实现思路;②辅助高校师生完成课程设计、毕业设计或学术论文复现工作;③通过获取开源共享资源加速个人或团队的项目开发与算法验证进程。; 阅读建议:该文档属于资源目录性质,缺乏连贯的技术论述与逻辑结构,建议使用者根据自身研究方向筛选相关条目,结合提供的代码和模型进行学习与实践,并注意核实所下载资源的有效性、完整性以及代码运行环境的兼容性。

ZOJ 3201 Tree

ZOJ 3201 Tree 树型dp 背包

Houheshuai的专栏 453

储能双向Buck-Boost+模型预测电流控制+电压下垂控制仿真【附参考文献】(Simulink仿真实现)

内容概要:本文档详细介绍了一套针对储能双向Buck-Boost变换器的Simulink仿真资源,融合模型预测电流控制与电压下垂控制策略,适用于微电网及分布式能源系统中的能量管理与稳定控制。仿真模型全面呈现了双向Buck-Boost电路在储能系统充放电过程中的动态行为,重点引入模型预测控制(MPC)与下垂控制相结合的先进控制算法,有效提升了系统的响应速度、稳定性与鲁棒性。文档不仅提供了完整的仿真模型结构与参数设置,还附有详实的参考文献,便于使用者深入理解控制原理并开展理论延伸研究,是电力电子、新能源系统等领域科研与教学的重要实践资料。; 适合人群:电气工程、自动化、新能源等相关专业的硕士博士研究生、科研人员以及从事电力电子变换器与微电网系统设计的工程师。; 使用场景及目标:①用于微电网中储能系统的建模与协调控制策略研究;②开展模型预测控制(MPC)与电压下垂控制在直流变换器中的联合应用仿真分析;③支撑高校电力电子课程实验、毕业设计及科研项目开发,深化对双向DC-DC变换器非线性特性和先进控制算法实现机制的理解。; 阅读建议:建议结合Simulink仿真模型与配套文档同步学习,重点关注控制器的设计逻辑、参数整定方法及系统动态响应特性,推荐对比传统PI控制与先进控制策略的仿真结果,以深入掌握不同控制方案的性能差异与优化路径。

基于STM32的智能垃圾分类机器人

垃圾分类是城市管理的重要环节,传统人工分拣效率低、成本高。本文设计了一款基于STM32的智能垃圾分类机器人,通过视觉识别与机械臂协同作业,实现垃圾自动分类与投放,适用于社区、公共场所等场景,可显著提升垃圾分类效率。:STM32H743(480MHz Cortex-M7,支持AI加速)本系统实现了垃圾分拣的自动化,显著提升了分类效率。OV5640摄像头(500万像素,支持JPEG输出)支持4类垃圾识别(可回收/厨余/有害/其他)问题讨论,stm32的资料领取可以私信!超声波避障(探测距离0.1-4m)

stm32d1219的博客 1820

【树形dp】PKU-3345-Bribing FIPA

dp[i][j]表示在以i为根的树选j个国家的最少费用,具体思维看代码…… 题目 #include #include #include #include #include #include #include #include using namespace std; #define FRE freopen("a.txt","r",stdin); #define inf 999999999

AndRing的专栏 863

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1604

【DP,状态压缩】PKU-1038-Bugs Integrated, Inc.

黑书上的一道较难的DP,用到了三进制状态压缩……虽然开始时有点思路,但是很多细节都不会处理,只能模仿人家的代码了……菜…… 有三个状态,0表示前两行为空,1表示只有前一行为空,2表示前一行不空……dp[i][j],i表示第几行,j表示某一种状态…… #include using namespace std; int m,a[10],b[10],c[11]; short dp[151

AndRing的专栏 834

WebRTC Qos优化杂记

本文是笔者对WebRTC Qos性能研究、优化的一些思考,希望对有兴趣的读者有一些启发。

sonysuqin的专栏 6678

EtherCAT-7 从站代码移植-SPI

STM32F103 + AX58100,从站代码移植。

tianya_xuan的博客 3571

【最小点覆盖(树形dp)】PKU-3659-Cell Phone Network

题意:一棵树,,删掉一个节点,,可以消灭自己和与其相邻的节点,,,问最少删掉几个节点可以消灭所有的节点? 思路:树形dp,分三个状态,首先dp[i][j]表示以这点为跟的子树的后代都被消灭了,而dp[i][0]不删除且不被其相邻的点消灭,dp[i][1]表示这点不删除但被其相邻的点消灭,dp[i][2]表示这点删除,然后就是不同状态之间的转移了,具体看代码。 题目 #include #i

AndRing的专栏 759

YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 1366

【dp+dfs】VK Cup 2012 Round 1-D. Distance in Tree

dp+dfs好题,状态转移写得很赞……dp[i][j中的i表示以第几个点为中心,j长度,综合起来表示以i为中心长度为j的边的总数…… 题目 #include #include using namespace std; int k; __int64 ans,dp[50005][505]; vector v[50005]; void dfs(int x,int y) { int i,j,z;

AndRing的专栏 715

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 817

OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

第一章:OSG介绍; 1.1 OSG简介。

LuckyHanMo的博客 3223

【dp】HUST-1351-Group

很好的一道dp,它的状态转移真的是太巧秒了! 题意:给出一段数列,要求你将这段数列分割成最多k段且每段的个数不能少于l的数列,然后求一个和,它是由一段中所有数字的总和乘以这一段的段数,即这一段是第几段,然后把所有这样的和加起来得到的,问这个和最小是多少! 思路:先用sum[i]数组表示1到i这段数列的总和,数组dp[i][j],表示的是将1到j这段数组分割成i段的最小值。所以状态转移为: t

AndRing的专栏 653

TC3XX - MCAL知识点(二十七):SENT Mcal配置及代码实战(单边半字节传输协议)

SENT协议只有一根线,异步传输!Sent协议的全称为Single Edge Nibble Trans .isson,单边半字节传输协议,是一种单线异步串行通信协议。Sent报文包含8个Nibble和一个校准位如图1所示,每一个Nibble数据被编码成PWM方式。设计这种协议的目的是用在与汽车ECU快速交互信息的传感器上,以此来取代低精确度的10bit AD和PWM。Sent是一种点对点的单方向从传感器到控制端的协议,控制器不需要同步信号。

梦想技术家 2272

【树形dp】PKU-2486-Apple Tree

在原来很裸的树形dp上加了些限制条件,不过知道状态转移还是很好做的,但状态转移不好想啊,都是看了人家的结题报告后才知道的! 题目 #include #include #include #include #include #include #include #include using namespace std; #define FRE freopen("a.txt","r",stdin)

AndRing的专栏 648

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【DP+记忆化搜索】PKU-1191-棋盘分割

题目 sum[x0][y0][x1][y1]表示的是左上角为(x0,y0),右上角为(x1,y1)的矩形的每个点分数总和的平方;dp[n][x0][y0][x1][y1]表示的是左上角为(x0,y0),右上角为(x1,y1)的矩形再经n刀切到的方差的平方加上平均值的平方的和再乘以n…… 状态转移方程为dp(n, x0, y0, x1, y1)=Min( Min( dp[n-1, x0, y

AndRing的专栏 614

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【DP】-Codeforces Round #110 (Div. 1)-C. Cipher

个人觉得很神奇的一道DP…… 题目要求求出给出字符串经过题目要求的变换可以得到多少各不同的字符串。可以证明的是,这些字符串加起来的和都一样,所以dp[i][j]的i表示的是字符串的长度,j表示的是字符串所有字母加起来的和,状态转移方程为dp[i+1][j+k]+=dp[i][j](1 题目 #include #include using namespace std; #define mo

AndRing的专栏 590

假人有限元模型

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

【树状数组】PKU-2057-The Lost House

这里有挺完整的题解:http://blog.youkuaiyun.com/find_my_dream/article/details/4864657 题目 #include #include #include #include #include #include #include #include using namespace std; #define FRE freopen("in.txt","r

AndRing的专栏 572

【树状数组】PKU-2152-Fire

一道处理的很巧妙的树状数组……都是参考大牛的代码的…… 题目 大牛题解 #include #include using namespace std; template T Max(T x,T y){return x>y?x:y;} template T Min(T x,T y){return x<y?x:y;} #define N 1005 #define inf 999999999

AndRing的专栏 556

【树形dp】PKU-3107-Godfather

题目要求找到这样的一个点,当删除这个点后使得形成的深林的最大的子树的节点最小。而且这些点可能有多个,请一一输出。其实这道题就是1655的翻版,不过在这道题中不能用stl中的vector,因为会超时,所以要用邻接表来存储。 题目 #include #include #include #include #include #include #include #include using name

AndRing的专栏 518

【DP+记忆化搜索】PKU-1390-Blocks

http://poj.org/problem?id=1390 又是黑书上的一道坑爹题,不过话说越坑爹越能学到东西……这里就贴上黑书上的解析吧…… 分析 线性DP 参照《算法艺术》上的算法 题目的方块可以表示称color[i],len[i],1 这里l表示有多少"段"不同的颜色方块 color[i]表示第i段的颜色,len[i]表示第i段的方块长度 让f[i,j,k]表示把(c

AndRing的专栏 503
上一篇: 【dp+dfs】VK Cup 2012 Round 1-D. Distance in Tree
下一篇: VK Cup 2012 Qualification Round 2部分题解(C,D,E)
AndRing
博客等级 码龄15年 5粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值