洛谷p2015二叉苹果树&yzoj1856多叉苹果树题解
多叉
有一棵苹果树,如果树枝有分叉,可以是分多叉,分叉数k>=0(就是说儿子的结点数大于等于0)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1~N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置 。
数据规模:
对于20%的数据,满足1 <= n <=15。
对于40%的数据,满足1 <= n <=100。
对于100%的数据,满足1 <= n <=310,c<=2^31-1。
两道树形DP题,一样的代码改下细节就能过,令f[x][y]表示以x为根的子树保留y条边最多苹果数,易得出状态转移方程
f[x][[t]=max(f[x][t] , f[x][t-j-1] + f[y][j]+edge[i])
其中y是x的子节点,edge[i]表示x->y这条边上的苹果树,用f[x][t-j-1]而不是f[x][t-j]是因为我们还要保留x->y这条边,最后01背包倒序枚举即可。
二叉苹果树代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,q,f[maxn][maxn];
int head[maxn],Next[2*maxn],ver[2*maxn],edge[2*maxn],tot,u,v,z;
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void dp(int x,int fa){
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa) continue;
dp(y,x);
for(int t=q;t>=1;--t){
for(int j=t-1;j>=0;--j){
f[x][t]=max(f[x][t],f[x][t-j-1]+f[y][j]+edge[i]);
}
}
}
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<n;++i){
scanf("%d %d %d",&u,&v,&z);
add(u,v,z);
add(v,u,z);
}
dp(1,0);
printf("%d",f[1][q]);
return 0;
}
多叉苹果树代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=330;
int n,q;
long long f[maxn][maxn];
int head[maxn],Next[2*maxn],ver[2*maxn],edge[2*maxn],tot,u,v,z;
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void dp(int x,int fa){
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa) continue;
dp(y,x);
for(int t=q;t>=1;--t){
for(int j=t-1;j>=0;--j){
f[x][t]=max(f[x][t],f[x][t-j-1]+f[y][j]+(long long)edge[i]);
}
}
}
}
int main(){
scanf("%d %d",&n,&q);
for(int i=1;i<n;++i){
scanf("%d %d %d",&u,&v,&z);
add(u,v,z);
add(v,u,z);
}
dp(1,0);
printf("%lld",f[1][q]);
return 0;
}
洛谷p2015二叉苹果树&yzoj1856多叉苹果树题解的更多相关文章
- 洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...
- 洛谷 P2015 二叉苹果树(codevs5565) 树形dp入门
dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿 ...
- 洛谷 P2015 二叉苹果树 && caioj1107 树形动态规划(TreeDP)2:二叉苹果树
这道题一开始是按照caioj上面的方法写的 (1)存储二叉树用结构体,记录左儿子和右儿子 (2)把边上的权值转化到点上,离根远的点上 (3)用记忆化搜索,枚举左右节点分别有多少个点,去递归 这种写法有 ...
- 洛谷P2015 二叉苹果树
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- 洛谷 P2015 二叉苹果树
老规矩,先放题面 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端 ...
- 洛谷—— P2015 二叉苹果树
https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...
- 洛谷P2015 二叉苹果树(树状dp)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- 洛谷P2015二叉苹果树
传送门啦 树形 $ dp $ 入门题,学树形 $ dp $ 的话,可以考虑先做这个题. $ f[i][j] $ 表示在 $ i $ 这棵子树中选 $ j $ 个苹果的最大价值. include #in ...
- 洛谷 P2015 二叉苹果树 题解
题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); #include ...
随机推荐
- 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Oracle jdbc 插入 clob blob
Oracle 使用 clob 与 blob 插入一些比较庞大的文本或者文件,JDBC 插入时 也比较简单 表结构 CREATE TABLE test_info ( user_id int NOT NU ...
- eclipse导入码云-GIT项目
1.首先找到项目源码地址我随便找到一个git地址 :https://gitee.com/mingSoft/MCMS 2.打开eclipse空白处右键导入项目搜索git. 3.将第一步复制的git地址复 ...
- .xxx.sh脚本无法启动,原来都是特殊字符搞的鬼?
今天遇到个趣的问题,linux上springboot启动,连接达梦数据库报错. 解决思路: 1)是不是数据库本身有问题,客户端登录没问题. 2)排查是不是war包问题,本地连接数据库,没问题. 3)是 ...
- 5、数组的复制(test2.java、test3.java)
对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去, ...
- Spring IoC源码解析之getBean
一.实例化所有的非懒加载的单实例Bean 从org.springframework.context.support.AbstractApplicationContext#refresh方法开发,进入到 ...
- EMCAscript6随心所记
es6的支持情况http://kangax.github.io/compat-table/es6/ 1.let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变 ...
- php Basic HTTP与Digest HTTP 应用
Basic HTTP 认证范例 <?php //Basic HTTP 认证 if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authen ...
- 常见ASP脚本攻击及防范技巧
由于ASP的方便易用,越来越多的网站后台程序都使用ASP脚本语言.但是, 由于ASP本身存在一些安全漏洞,稍不小心就会给黑客提供可乘之机.事实上,安全不仅是网管的事,编程人员也必须在某些安全细节上注意 ...
- Netty基础系列(5) --零拷贝彻底分析
前言 上一节(堆外内存与零拷贝)当中我们从jvm堆内存的视角解释了一波零拷贝原理,但是仅仅这样还是不够的. 为了彻底搞懂零拷贝,我们趁热打铁,接着上一节来继续讲解零拷贝的底层原理. 感受一下NIO的速 ...