题目链接:http://codeforces.com/contest/816/problem/E

题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被使用,问初始金钱为b时 最多能买多少件商品? n<=5000,ci,di,b<=1e9

题解:显然是一道树形dp由于有两种情况就是当前点为根结点的时候选择打折还是不打折,如果选不打折之后的节点都不能打折。

不妨设dp[i][j][flag]表示i为根j为种类数,flag为状态表示选不选打折的最小花费。转移方程为

dp[u][j + l][0] = min(dp[u][j + l][0] , dp[u][j][0] + dp[v][l][0]);

dp[u][j + l][1] = min(dp[u][j + l][1] , min(dp[u][j][1] + dp[v][l][0] , dp[u][j][1] + dp[v][l][1]));

具体看代码。

#include <iostream>
#include <cstring>
#include <vector>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
const int M = 5e3 + 10;
vector<int>vc[M];
ll pa[M] , pb[M] , dp[M][M][2] , sz[M];
void dfs(int u) {int len = vc[u].size();sz[u] = 1;dp[u][0][0] = 0 , dp[u][1][0] = pa[u] , dp[u][1][1] = pa[u] - pb[u];for(int i = 0 ; i < len ; i++) {int v = vc[u][i];dfs(v);for(ll j = sz[u] ; j >= 0 ; j--) {for(ll l = 0 ; l <= sz[v] ; l++) {dp[u][j + l][0] = min(dp[u][j + l][0] , dp[u][j][0] + dp[v][l][0]);dp[u][j + l][1] = min(dp[u][j + l][1] , min(dp[u][j][1] + dp[v][l][0] , dp[u][j][1] + dp[v][l][1]));}}sz[u] += sz[v];}//这里看似是3个for实际上就是3个for但是复杂度却不是O(n^3),由于sz[i]表示的是以i为根的最多有几个子节点类似前缀的一种东西,由于dfs,这些sz只会用一次不会有重复。所以理论上复杂度就是O(n^2)。
}
int main() {int n , b;scanf("%d%d" , &n , &b);for(int i = 1 ; i <= n ; i++) {int c , d , x;if(i == 1) {scanf("%d%d" , &c , &d);pa[i] = c , pb[i] = d;}else {scanf("%d%d%d" , &c , &d , &x);pa[i] = c , pb[i] = d;vc[x].push_back(i);}}memset(dp , inf , sizeof(dp));dfs(1);int ans = 0;for(int i = 0 ; i <= n ; i++) {if(dp[1][i][0] <= b || dp[1][i][1] <= b) ans = i;}printf("%d\n" , ans);return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/7056547.html

codeforces 816 E. Karen and Supermarket(树形dp)相关推荐

  1. CF815C Karen and Supermarket [树形DP]

    题目传送门 Karen and Supermarket On the way home, Karen decided to stop by the supermarket to buy some gr ...

  2. Codeforces 671D. Roads in Yusland(树形DP+线段树)

    调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...

  3. CodeForces - 856B Similar Words(AC自动机+树形dp)

    题目链接:点击查看 题目大意:给出一个大小为 n 的字符串集记为 X,给出两个字符串相似的定义为:如果某个字符串去掉首字母可以得到另一个字符串 现在需要构造一个尽可能大的字符串集,满足以下两个条件: ...

  4. CodeForces - 1092F Tree with Maximum Cost(树形dp+树根转移)

    题目链接:点击查看 题目大意:给出一个树,每个顶点都有一个权值,任意一点到其他点的距离为经过边的数量,求出一点到其他每一个点的距离*权值之和最大 题目分析:树形dp,一开始怎么也想不明白,看了别人的代 ...

  5. CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)

    题目链接:点击查看 题目大意:给定n个点,每个点的权值分别对应颜色:0:无颜色,1:红色,2:蓝色,现在需要切割边,使切割后的两个部分不能出现红色和蓝色掺杂的部分,也就是说两个部分必须只能各自含有一个 ...

  6. codeforces 816 B. Karen and Coffee(思维)

    题目链接:http://codeforces.com/contest/816/problem/B 题意:给出n个范围,q个查询问查询区间出现多少点在给出的n个范围中至少占了k次 题解:很显然的一道题目 ...

  7. CodeForces 771C Bear and Tree Jumps 树形DP

    题意: 给出一棵树,一个人可以在树上跳,每次最多跳\(k(1 \leq k \leq 5)\)个点 定义\(f(s,t)\)为从顶点\(s\)跳到顶点\(t\)最少需要跳多少次 求\(\sum\lim ...

  8. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  9. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)

    一.题目链接 https://codeforces.com/contest/1293/problem/E 二.题意 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~n-2不重复的值 ...

最新文章

  1. html es表达式传参,ES2015 正则表达式新增特性
  2. 安卓桌面软件哪个好_安卓模拟器哪个比较好?
  3. ThinkPHP中的快捷函数小结
  4. 硬件工程师如何成为焊接界的高手
  5. 关于反射Assembly.Load(程序集).CreateInstance(命名空间.类)
  6. 有关Canvas的一点小事—图像绘制
  7. @大学生,送给步入大学生活的你,高速学编程。
  8. 来吧~不要互相伤害,ssh之间要互相信任
  9. Echarts 柱状图设置颜色
  10. maxima学习笔记(一)
  11. react-shopping-cart尺码筛选
  12. 兴华苑社区关爱空巢老人社会实践
  13. 卖高价的洋水果是个好榜样
  14. DVI接口关于技术性的知识导论
  15. 单例模式——国庆收心
  16. 公告:CSDN个人空间即将改版
  17. python 课程体系
  18. Oracle突然无法登录,ORA-12514:TNS
  19. kafka线上环境搭建对软硬件要求
  20. HT合泰 单片机的仿真调试

热门文章

  1. tp5 mysql定时任务_tp5+mysql实现消息队列,并在mac系统下定时执行-Go语言中文社区...
  2. 3.12 - Tuples in Python
  3. RGB to xml(labelimg应用)
  4. seafile自建服务器,自建云盘系列——Seafile (支持分布式存储)
  5. android 关闭软键盘_「安卓之父」创立的 Essential 公司宣布关闭
  6. 农业知识图谱(KG):农业领域的信息检索,命名实体识别,关系抽取,分类树构建,数据挖掘...
  7. 浅谈今日头条关键词下拉词框优化推广的优势
  8. 马来西亚什么时候学计算机,关于马来西亚大学里的计算机专业,你知道多少?...
  9. java绘制有向图_AcWing 848. 有向图的拓扑序列 Java
  10. 电脑服务器系统被管理员停用,Win7系统任务管理器已被系统管理员停用怎么办?...