luoguP2015(简单树形DP)
题目链接:https://www.luogu.org/problemnew/show/P2015
题意:给定一颗结点个数为n的树,有n-1条边,每条边有个权值,树根为1。现在给出q <=n,问剪枝后保留q条边后的边的权值最大是多少。
思路:首先要知道这道题有个隐含条件,如果某条边被保留,那么从根节点到这个点路径上的所有点都必须保留。
我们用dp[i][j]表示顶点i的子树上保留j条边的最大权值和是多少。
给出状态转移方程:dp[x][j]=max(dp[x][j] , dp[x][j-1-k]+dp[y][k]+edge[i].w)
其中x是当前结点,y是x的一个子结点,k表示结点y上保留的边数,0<j<=min(siz[x],q),0=<k<=min(siz[y],j-1)。因为要把x和y之间的边算上,所以是j-1-k。
其中j需要倒序枚举,类似01背包。
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=; struct node{
int v,w,nex;
}edge[maxn<<]; int n,q,cnt,head[maxn],siz[maxn];
int dp[maxn][maxn]; void adde(int u,int v,int w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].nex=head[u];
head[u]=cnt;
} void dfs(int x,int f){
for(int i=head[x];i;i=edge[i].nex){
int y=edge[i].v;
if(y==f) continue;
dfs(y,x);
siz[x]+=siz[y]+;
for(int j=min(siz[x],q);j;--j)
for(int k=;k<=min(siz[y],j-);++k)
dp[x][j]=max(dp[x][j],dp[x][j--k]+dp[y][k]+edge[i].w);
}
} int main(){
scanf("%d%d",&n,&q);
for(int i=;i<n;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);
adde(v,u,w);
}
dfs(,-);
printf("%d\n",dp[][q]);
return ;
}
luoguP2015(简单树形DP)的更多相关文章
- poj 2342 Anniversary party 简单树形dp
		
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3862 Accepted: 2171 ...
 - hdu4705 Y 简单树形DP 2013多校训练第十场 J题
		
题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...
 - [10.27_P2] 统计损失 (简单树形DP)
		
树形DP 简单题 Description 给定一棵树,每个节点有一个值.对于一条路径,它的值为路径上所有点的值的乘积.求出树上所有路径的值的和. 注意:单个点也算一条路径. Input 第 1 行一个 ...
 - [Luogu P1122]最大子树和  (简单树形DP)
		
题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...
 - hdu 1520Anniversary party(简单树形dp)
		
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
 - HDU 3899 简单树形DP
		
题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...
 - hdu1520  Anniversary party 简单树形DP
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:树形DP的入门题 定义dp[root][1]表示以root为根节点的子树,且root本身参 ...
 - Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)
		
<题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...
 - HDU 4705 Y (2013多校10,1010题,简单树形DP)
		
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...
 - hdu 1054 Strategic Game (简单树形DP)
		
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
 
随机推荐
- keras手写数字识别
			
import kerasimport timefrom keras.utils import np_utils start = time.time()(x_train, y_train), (x_te ...
 - Jmeter接口测试之用例数据分离
			
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
 - tomcat使用jdbc连接mysql出现的错误
			
出现的错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 前提: 已经在工程的build path中添加了驱动包(mysql-conn ...
 - 使用wait/notify实现生产消费模型
			
public class A { private Deque<Integer> list = new LinkedList<>(); private int max = 10; ...
 - Git本地安装
			
1 Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码 ...
 - BZOJ3033太鼓达人
			
第一问,1<<k,谁都看得出来. 毫无思路,暴搜,枚举每一个数列,Hash加map判断是否重复,拿到30,打表都打不出来. #include <iostream> #inclu ...
 - TCP被动打开 之 第二次握手-发送SYN+ACK
			
假定客户端执行主动打开,发送syn包到服务器,服务器执行完该包的第一次握手操作后,调用af_ops->send_synack向客户端发送syn+ack包,该回调实际调用tcp_v4_send_s ...
 - 【软件工程】Alpha冲刺(1/6)
			
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 了解了反馈机制的实现原理 确定好算法的框架 对接口的规范化进行学习 展示Git ...
 - koa 基础(十八)es6中的类、静态方法、继承
			
1.app.js /** * es6中的类.静态方法.继承 */ // 定义Person类 class Person { constructor(name, age) { /*类的构造函数,实例化的时 ...
 - 微服务一键启动脚本shell没有环境变量的
			
#!/bin/bash#######################################################export JAVA_HOME=/root/data/app/jd ...