poj 2486 树形dp(给定步数 走一棵树,获得的节点值总和的最大值)
来源:互联网 发布:spyder导入tensorflow 编辑:程序博客网 时间:2024/05/16 02:11
#include<cstdio>#include<cstring>#define MAX(x,y) ((x)>(y)?(x):(y))struct node{int to,next;}e[2400];int cnt,n,k,head[220],dp[220][220][2],v[220];void add_edge(int from,int to){e[cnt].to=to;e[cnt].next=head[from];head[from]=cnt++;}void dfs(int u,int v){for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==v)continue;dfs(to,u);for(int j=k;j>0;j--)for(int p=1;p<=j;p++){dp[u][j][0]=MAX(dp[u][j][0],dp[u][j-p][1]+dp[to][p-1][0]);if(p>1){dp[u][j][0]=MAX(dp[u][j][0],dp[u][j-p][0]+dp[to][p-2][1]);dp[u][j][1]=MAX(dp[u][j][1],dp[u][j-p][1]+dp[to][p-2][1]);}}}} int main(){while(~scanf("%d%d",&n,&k)){ for(int i=1;i<=n;i++) { scanf("%d",&v[i]); for(int j=0;j<=k;j++) dp[i][j][0]=dp[i][j][1]=v[i]; } cnt=0; memset(head,-1,sizeof(head)); for(int i=1;i<n;i++) { int a,b; scanf("%d%d",&a,&b); add_edge(a,b); add_edge(b,a); } dfs(1,-1); printf("%d\n",dp[1][k][0]); }}
0 0
- poj 2486 树形dp(给定步数 走一棵树,获得的节点值总和的最大值)
- 节点数值总和等于某个给定值的所有路径
- 树中走N步求获得的最大金币数 树形DP SRM 666 div2 problem999
- poj 1947 树形dp(得到含P个节点联通块的最小切边数)
- VC求一组数的最大值最小值总和以及平均值
- 给定BST,使用大于等于当前节点的总和代替当前节点
- 求tree中节点之间路径总和等于给定数值的算法
- 给你一个二叉树,其中每个节点都包含一个整数值。查找总和给定值的路径数,路径不需要在根或叶子处开始或结束,但必须向下
- HDU 5242Game 树上的贪心 树形dp 求出使K条链的权值总和最大
- 给定四个正整数,求出四个数的最大值并输出
- 给定四个正整数,求出四个数的最大值和最小值
- poj 2486 Apple Tree (带回溯的树形dp)
- poj 2486 树形dp
- poj 2486 树形DP
- poj 2486 树形dp
- poj 2486 树形DP
- poj-2486-树形dp
- poj 2486( 树形dp)
- tensorflow:Couldn't open CUDA library libcupti.so.8.0. LD_LIBRA
- 数据结构 二叉树实现
- 移动端界面标注:如何理清标注的思路?
- 设计模式一之单例模式
- C
- poj 2486 树形dp(给定步数 走一棵树,获得的节点值总和的最大值)
- 数据结构 Huffman编码实现
- 最小生成树(prim算法)模板
- 无bug版本的生物信息学c++工具包 BALL 1.1.1
- jz2440开发板-软件环境的构建
- Arrays.sort方法的实现过程,以字符数组为例
- #1 Python列表
- Activity的四种LaunchMode详解
- Setup Factory使用——安装包进行安装前检查系统是否安装了其它相关系统