树形DP入门(二叉苹果树+没有上司的舞会)
树形dp学习笔记 - _Lancy - 博客园二叉苹果树 二叉苹果树 没有上司的舞会
二叉苹果树的处理可以说是非常模板了,正常容易联想到倒过来的数字三角形
for(int i=n;i>=1;i--)
{for(int j=1;j<=i;j++){f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];}
}
printf("%d",f[1][1]);
数字三角形中上一层的答案有下一层的左右两个转移来,二叉树上则是父节点的数值由其子节点转移来,f [ u ] [ i ] = max ( f [ u ] [ i ] ,f [ u ] [ i − j − 1 ] + f [ v ] [ j ] + w )注意两点:①dfs放在第二三重循环前 ②计算边的时候记得加一
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); }while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }return x*f;
}
int n,m,num[10010],dp[110][110];
struct tree{int to,next,w;}e[10010];
int cnt,head[10010];
void add_edge(int u,int v,int w)
{e[cnt].w=w;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt++;
}
void dfs(int from,int root)
{for(int i=head[from];~i;i=e[i].next){int v=e[i].to;if(root==v) continue;dfs(v,from);num[from]+=num[v]+1;for(int j=min(num[from],m);j;j--)for(int k=min(j-1,num[v]);k>=0;k--)dp[from][j]=max(dp[from][j],dp[from][j-k-1]+dp[v][k]+e[i].w);}
}
int main()
{memset(head,-1,sizeof head);n=read();m=read();for(int i=1;i<n;i++){int u,v,w;u=read();v=read();w=read();add_edge(u,v,w);add_edge(v,u,w);}dfs(1,-1);printf("%d",dp[1][m]);return 0;
}
没有上司的舞会是一道久负盛名到被 OI Wiki拿来做例题的树上DP,最离谱的地方在于分情况讨论某个人到底来不来。为了解决分情况,我们开二维数组,用二维的 0 / 1 来表示 不来 / 来。如果来就没法加他儿子的快乐值,如果不加就看他儿子的快乐值大还是儿子的儿子的儿子......快乐值大
#include<bits/stdc++.h>
using namespace std;
int head[100010],n,cnt,f[100010][2],ans,h[100010],vis[100010];
struct edge{int u,v;}e[100010];
void add(int x,int y)
{e[++cnt].u=y;e[cnt].v=head[x];head[x]=cnt;
}
void calc(int k)
{vis[k]=1;for(int i=head[k];i;i=e[i].v){if(!vis[e[i].u]){calc(e[i].u);f[k][1]+=f[e[i].u][0];f[k][0]+=max(f[e[i].u][0],f[e[i].u][1]);}}return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&f[i][1]);}for(int i=1;i<n;i++){int l,k;scanf("%d%d",&l,&k);h[l]=1;add(k,l);}for(int i=1;i<=n;i++){if(h[i]==0){calc(i);printf("%d",max(f[i][1],f[i][0]));return 0;}}
}
树形DP入门(二叉苹果树+没有上司的舞会)相关推荐
- AcWing1074. 二叉苹果树(树形DP)题解
题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点. 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一 ...
- 洛谷2015 二叉苹果树 树形DP
https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec 内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...
- 洛谷P2015 二叉苹果树【树形dp】
P2015 二叉苹果树 时间限制 1.00s 内存限制 125.00MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点 ...
- 二叉苹果树(树型DP+背包)
二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...
- 【算法•日更•第九期】树型动态规划详解:二叉苹果树
▎前置技能:动态规划&树 树型动态规划一听就知道是在树结构上使用的动态规划,那么不会树结构和动态规划怎么行?戳这里了解动态规划和树. ▎什么是树型动态规划? ☞『定义』 树形动态规划问题可以分 ...
- 洛谷 P2015 二叉苹果树 题解
洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...
- 入门二叉平衡树的世界
入门二叉平衡树的世界 1. 二叉平衡树的概念 二叉平衡树又称AVL树,它或者是一棵空二叉树,或者是具有下列性质的二叉树: 1) 根的左右子树高度之差的绝对值不超过1: 2) 根的左右子树都是二 ...
- 入门二叉搜索树的世界
入门二叉搜索树的世界 1. 二叉搜索树的概念 二叉搜索树,二叉查找树,二叉排序树说的都是一个概念.这篇博文中我们称其为二叉搜索树.二叉搜索树指的是一棵空树,或者具有下列性质的二叉树: 1)弱左 ...
- P2015 二叉苹果树 树形DP
题目描述 有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点) 这棵树共有 NN 个结点(叶子点或者树枝分叉点),编号为 1 \sim N1∼N,树根编号一定是 11. 我们用一 ...
最新文章
- 雨滴桌面时间插件_如何设置极简桌面?学会了看电脑都赏心悦目
- “中序表达式”转“后续表达式”
- 纹身电极: 一种新型的可以进行脑信号测量的电极
- java正则表达式替换指定字符串_笔记_正则表达式替换字符串中特定范围内的字符。...
- Runtime使用单例模式,饿汉式
- [转帖]mysql ERROR 1130 解决办法
- github 和git_Google编码文档:Git和GitHub
- 【李宏毅机器学习】Basic Concept 基础概念(p4) 学习笔记
- 驱动12.移植dm9000驱动程序
- Wi-Fi Direct
- Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法
- ALSA 音频工具 amixer、aplay、arecord
- matlab按图像边缘抠图_PS抠图教程_PS抠图方法大全
- 加装固态硬盘+安装win10系统
- 数据库 -- 基础操作(二)
- 5g网速究竟有多快?比4g快多少?
- 2020.08.10多态
- windows查看本机的mac地址
- 【USACO】青铜莲花池[2]
- 4.通过Opencv采集摄像头视频数据