UVALive 6619 LIKE vs CANDLE(树形DP)
思路:
树形dp。因为最终答案要求的是差值,所以对于每个节点我们只需要考虑差值即可,dp[u][0]表示u节点以下(含u)中like的val比candle的val大的最大值,dp[u][1]表示candle的val值比like大的最大值。所以,对于每个节点我们就可以对于每个子树v:
dp[u][0] += dp[v][0];
dp[u][1] += dp[v][1];
但是对于原来已经翻转过的点,我们要无偿交换swap(dp[u][0], dp[u][1]);这点应该很明确(因为我们本来求的是没有翻转过的,现在由于这一点本来翻转过,导致我们本来求的东西都是相反的,所以要交换一下)。
这样的话就可以使得两个值都最大,然后再考虑翻转的情况,如果翻转的话,那么可以这样更新dp值。
dp[u][0] = max(dp[u][0], dp[u][1] - sub);
dp[u][1] = max(dp[u][1], dp[u][0] - sub);
sub表示翻转需要的代价。
然后需要注意的一点就是对于树根0,我们不能翻转,根据题目可以很容易看出来。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 50000+500;
vector<int>e[maxn];
int w[maxn];
int vis[maxn];
int dp[maxn][2];
int n,x,y;
void dfs(int u)
{dp[u][0]=w[u];dp[u][1]=-w[u];for(int i = 0;i<e[u].size();i++){int v = e[u][i];dfs(v);dp[u][0]+=dp[v][0];dp[u][1]+=dp[v][1];}if(u!=0){if(vis[u])swap(dp[u][0],dp[u][1]);dp[u][0]=max(dp[u][0],dp[u][1]-(vis[u]?y:x));dp[u][1]=max(dp[u][1],dp[u][0]-(vis[u]?y:x));}
}
int main()
{while(scanf("%d%d%d",&n,&x,&y)!=EOF){for(int i = 0;i<=n;i++)e[i].clear();memset(dp,0,sizeof(dp));memset(w,0,sizeof(w));memset(vis,0,sizeof(vis));for(int i = 1;i<=n;i++){int fa,flag;scanf("%d%d%d%d",&w[i],&fa,&vis[i],&flag);e[fa].push_back(i);if(flag)w[i]=-w[i];}dfs(0);if(dp[0][0]<0)printf("HAHAHAOMG\n");elseprintf("%d\n",dp[0][0]);}
}
UVALive 6619 LIKE vs CANDLE(树形DP)相关推荐
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
- 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...
- 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)
题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...
- 树形dp ---- 2018年杭电多校第二场 H travel
题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...
最新文章
- 宜人贷YEP技术、数据沉淀背后:金融科技迎来开放赋能时代
- IntelliJ IDEA 2017.3.2 热加载(Hot Swap)
- C#操作Excel(读取)
- 网络相关知识点:nginx相关概念
- java学习入门怎么做最为高效
- 手动清空Element Select选择框内容 v-model 和 option下拉框选项 导致无法select选中,或者选中视图不渲染问题,
- 对话Satya Nadella:大规模AI模型、人机界面或将迎来大突破
- 2016 CSU - 1803
- mysql分组聚合compute_SQLServer之Compute/ComputeBy实现数据汇总
- (三)树莓派系列教程:树莓派4B上编写Python程序(C语言),并运行
- 计算机漏洞安全相关的概念POC 、EXP 、VUL 、CVE 、0DAY
- Linux 之父亮相,这个开源社区要“搞大事”
- 关于OPCUA的配套规范
- 三次指数平滑法(Holt-Winters)
- 0811 iOS开发完整学习路线
- Panabit镜像功能配合wireshark抓包的方法
- vue 右键菜单contextMenu
- 产品生命周期管理——高效的全生命周期的产品管理方法
- 强化学习1-思想及分类
- 从微信的成功看移动AppUI设计的精髓