树形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入门(二叉苹果树+没有上司的舞会)相关推荐

  1. AcWing1074. 二叉苹果树(树形DP)题解

    题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点. 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一 ...

  2. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  3. 洛谷P2015 二叉苹果树【树形dp】

    P2015 二叉苹果树 时间限制 1.00s 内存限制 125.00MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点 ...

  4. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  5. 【算法•日更•第九期】树型动态规划详解:二叉苹果树

    ▎前置技能:动态规划&树 树型动态规划一听就知道是在树结构上使用的动态规划,那么不会树结构和动态规划怎么行?戳这里了解动态规划和树. ▎什么是树型动态规划? ☞『定义』 树形动态规划问题可以分 ...

  6. 洛谷 P2015 二叉苹果树 题解

    洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...

  7. 入门二叉平衡树的世界

    入门二叉平衡树的世界 1. 二叉平衡树的概念     二叉平衡树又称AVL树,它或者是一棵空二叉树,或者是具有下列性质的二叉树: 1) 根的左右子树高度之差的绝对值不超过1: 2) 根的左右子树都是二 ...

  8. 入门二叉搜索树的世界

    入门二叉搜索树的世界 1. 二叉搜索树的概念     二叉搜索树,二叉查找树,二叉排序树说的都是一个概念.这篇博文中我们称其为二叉搜索树.二叉搜索树指的是一棵空树,或者具有下列性质的二叉树: 1)弱左 ...

  9. P2015 二叉苹果树 树形DP

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点) 这棵树共有 NN 个结点(叶子点或者树枝分叉点),编号为 1 \sim N1∼N,树根编号一定是 11. 我们用一 ...

最新文章

  1. 雨滴桌面时间插件_如何设置极简桌面?学会了看电脑都赏心悦目
  2. “中序表达式”转“后续表达式”
  3. 纹身电极: 一种新型的可以进行脑信号测量的电极
  4. java正则表达式替换指定字符串_笔记_正则表达式替换字符串中特定范围内的字符。...
  5. Runtime使用单例模式,饿汉式
  6. [转帖]mysql ERROR 1130 解决办法
  7. github 和git_Google编码文档:Git和GitHub
  8. 【李宏毅机器学习】Basic Concept 基础概念(p4) 学习笔记
  9. 驱动12.移植dm9000驱动程序
  10. Wi-Fi Direct
  11. Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法
  12. ALSA 音频工具 amixer、aplay、arecord
  13. matlab按图像边缘抠图_PS抠图教程_PS抠图方法大全
  14. 加装固态硬盘+安装win10系统
  15. 数据库 -- 基础操作(二)
  16. 5g网速究竟有多快?比4g快多少?
  17. 2020.08.10多态
  18. windows查看本机的mac地址
  19. 【USACO】青铜莲花池[2]
  20. 4.通过Opencv采集摄像头视频数据

热门文章

  1. python | 绘制中国地形图(带中国边界省界)
  2. MT4API交易接口是什么?
  3. 哈尔滨理工大学第五届ACM程序设计竞赛(热身)
  4. 27款国外最新Photoshop色板
  5. Vue 计算属性和ref的使用方法
  6. 在Linux中安装ALSA声卡驱动
  7. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一
  8. 智能音箱背后的自然语言理解和知识图谱技术
  9. Windows编程之COM组件
  10. Pg sql 创建自动增长列及修改序列当前值