分析:

不算难的树形DP套路题。

首先,分析这个答案:可以视为,在一条路径上,选择了一些点,这些点的贡献为:
其周围的所有点权和 - 路径上一步的点权。

既然给出的是一颗树,所以可以把路径分为从下往上,从上往下两部分。

D P [ x ] [ i ] [ 0 / 1 ] DP[x][i][0/1] DP[x][i][0/1]表示,在x的子树中,到达x的路径,0表示从下往上走到这里,1表示从这里走到下面的最大贡献。

分为两部分主要是为了区分上一步的点是谁。(往下走的,上一步就是树里面的fa,往上走的,上一步就是树里面的son)

然后转移就分这个点用不用磁铁,比较简单,实在不会看代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 100010
#define MAXV 110
using namespace std;
typedef long long ll;
ll dp[MAXN][MAXV][2];//0->go_up,1->go_down
vector<int> a[MAXN];
int n,V;
ll p[MAXN],sum[MAXN],ans;
ll getmax(ll &x,ll y){x=max(x,y);
}
void update(int x,int y,int fa){for(int i=1;i<V;i++)getmax(ans,dp[x][i][0]+dp[y][V-i][1]);//update the ans(...->u->x then x->v->...)for(int i=1;i<=V;i++){getmax(dp[x][i][0],max(dp[y][i][0],dp[y][i-1][0]+sum[x]-p[y]));//y->x,minus Pygetmax(dp[x][i][1],max(dp[y][i][1],dp[y][i-1][1]+sum[x]-p[fa]));//fa->x,minus Pfa}
}
void dfs(int x,int fa){for(int i=0;i<int(a[x].size());i++)if(a[x][i]!=fa)dfs(a[x][i],x);for(int i=1;i<=V;i++){dp[x][i][0]=sum[x];dp[x][i][1]=sum[x]-p[fa];  }for(int i=0;i<int(a[x].size());i++)update(x,a[x][i],fa);for(int i=1;i<=V;i++){dp[x][i][0]=sum[x];dp[x][i][1]=sum[x]-p[fa];  }for(int i=int(a[x].size())-1;i>=0;i--)//reverse it to avoid overlap  (u -> x -> u)update(x,a[x][i],fa); getmax(ans,max(dp[x][V][0],dp[x][V][1]));
}
int main(){SF("%d%d",&n,&V);int u,v;for(int i=1;i<=n;i++)SF("%d",&p[i]);for(int i=1;i<n;i++){SF("%d%d",&u,&v);   a[u].push_back(v);a[v].push_back(u);}for(int i=1;i<=n;i++)for(int j=0;j<int(a[i].size());j++)  sum[i]+=p[a[i][j]];dfs(1,0);PF("%lld",ans);
}

【树形DP】CEOI2017 Chase相关推荐

  1. 【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)

    点此看题面 大致题意: 有一棵树,树上编号为 i i i的节点上有 F i F_i Fi​个铁球,逃亡者有 V V V个磁铁,当他在某个节点放下磁铁时,与这个节点相邻的所有节点上的铁球都会被吸引到这个 ...

  2. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  3. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  4. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  5. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  6. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  7. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  8. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  9. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

最新文章

  1. nexus 离线下载中央库索引
  2. “不会Linux,怎么干程序员?”骨灰级工程师:干啥都不行!
  3. python 双边滤波与高斯滤波
  4. 回调函数function的test
  5. 正则表达式中(?:)的巨大作用
  6. 3分钟把区块链的技术与应用彻底讲清楚
  7. bootstrap-导航(基础样式)
  8. 在asp.net core 下定义统一的入参和出参格式
  9. MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能
  10. 论文浅尝 | WWW2022 - “知识提示”之知识约束预训练微调
  11. 【Java】Java趣味分享:try finally
  12. 8-ORACLE四种关闭方式
  13. 社会工程学攻击的三个典例
  14. 谷歌fireBase推送
  15. aes key iv从mysql_OpenSSL AES 算法中 Key 和 IV 是如何生成的?
  16. C语言ALG什么文件,alg.exe是什么进程文件?如何删除alg病毒?
  17. 工业机器人应用编程考核设备
  18. Ac-RADADADARADADADA-NH2
  19. element-ui中Cascader 级联选择器组件使用(默认选择是value(id),还想要获取label(name值))
  20. 蓝桥杯Python快速入门(4)

热门文章

  1. 点击按钮给网页换皮肤简单js实现
  2. 优酷html5速度慢,优酷发力Html5技术关注高品质移动体验
  3. ps调整图片大小失真最小
  4. 小悦文件保险箱 - 一款基于DuiLib 库开发的文件加密工具
  5. 使用paddlespeech实现语音克隆合成
  6. 盘点2021上半年电商直播行业发生过的大事
  7. 施耐德电气尹正:智能制造始于IT赋能OT
  8. 英语是计算机编程的根。从零开始学英语(日常用语01-20句)
  9. untiy加载一张本地图片到Image 精灵
  10. 尊重兴趣,是尊重生命深处的本能