题目链接:[CTSC1997] 选课 - 洛谷

分析:这是一道树上背包的模板题,什么是树上背包呢?就是说物品之间有依赖关系,就比如说选a就必须要先选b,选b又必须要先选c,大概就是这个意思,类似于我们大学课程之间的关系,但又不完全是,因为我们大学课程中一门课可能有多门先修课,但是树上背包要求每一个物品只能依赖于其他1个物品或者不依赖于其他物品,这个也比较容易理解,毕竟树不就是一对多的关系吗?知道了这个之后,我们来对这道题目进行讲解,首先设f[i][j]表示在以i为根节点的子树中选了j门课所获得的最多学分,下面我们分析动态转移方程:

我们只能用一个点的子节点去更新这个点,所以假如我们当前这颗树的最优解选了k门课,其中一定包含根节点这门课(这个条件一定不能忽视),然后我们可以枚举每一个子节点选的课程数i,然后k-i就是以x为根的子树中去掉当前子节点之外其他节点所选的课程数了,就这样更新完就可以得到最后的答案了。

下面给出一个错误的更新代码,我来带着大家分析一下这样更新为什么是错误的:

for(int j=1;j<=m+1;j++)
for(int k=1;k<=j-1;k++)f[x][j]=max(f[x][j],f[x][k]+f[son][j-k]);

我们当前更新的是以第x个节点为根的子树,用到的子节点是son,j是以x为根的子树中所选的节点总数,而k是用到的除了当前用到的子节点之外的节点,而j-k就是以当前子节点为根的子树中所选的节点数目了,明白了这些之后我来分析一下这样为什么是错的。

我们假如当前j是7,那么k可以是1~6,在我们k是7之前已经更新完了k是1~6的情况,而且这个更新过程中可能用到了以当前子节点为根的子树中的节点,这就会导致我们先在更新较大的j时f[x][k]也会包含以当前子节点为根的子树中的节点,而由我们刚才的分析明确可以看出k是用到的除了当前用到的子节点之外的节点数,所以这就会导致错误

更正的方法也比较简单,只需要把j的那层循环倒置即可,也就是

for(int j=m+1;j>=1;j--)
for(int k=j-1;k>=1;k--)f[x][j]=max(f[x][j],f[x][k]+f[son][j-k]);

这样我们在用小于j的k更新j时f[x][k]还没有被更新到,这样更新就不会出现问题了,这里还需要说明的一个技巧就是可能有多个节点没有先修课,所以我们最终的答案就很难统计,我们可以建立一个权值为0的节点,然后让所有没有先修课的课程的先修课为0,这样我们最后就只需要通过f[0][m+1]就可以知道答案了,为什么是m+1呢?因为这个时候我们包含了第个节点,而这只是一个虚拟节点,所以就需要把选m门课改成选m+1门课,前提是别忘了将第0门课的学分设置为0.

下面是代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
const int N=1003;
int f[N][N];//f[i][j]表示以i为节点的子树中选j门课所获得的最大学分
int n,m,h[N],e[N],ne[N],w[N],idx;
void add(int x,int y)
{e[idx]=y;ne[idx]=h[x];h[x]=idx++;
}
void dfs(int x,int fa)
{f[x][1]=w[x];//只选根节点 for(int i=h[x];i!=-1;i=ne[i]){int son=e[i];if(son==fa) continue;dfs(son,x);for(int j=m+1;j>=1;j--)for(int k=j-1;k>=1;k--)f[x][j]=max(f[x][j],f[x][k]+f[son][j-k]);}
}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);int k;for(int i=1;i<=n;i++){scanf("%d%d",&k,&w[i]);if(k==0) add(0,i);//第i门课没有先修课,所以我们可以给其加上一门权值为0的先修课0 else add(k,i);}dfs(0,-1);printf("%d",f[0][m+1]);return 0;
}

(P2014[CTSC1997])选课(树上背包)相关推荐

  1. 【每日DP】day 8、P2014 [CTSC1997]选课(树形DP(树形背包)模板)难度⭐⭐⭐

    P2014 [CTSC1997]选课 题意为选一门课前要看它是否有前提条件:即选了一门主课才能选 "副科",所以可以树形背包来做. 注意是不能用分组背包来做,因为这道题附件有很多个 ...

  2. luogu 2014 选课 树上背包

    树上背包 #include<bits/stdc++.h>using namespace std;const int N=310; const int inf=0x3f3f3f3f; vec ...

  3. P2014 [CTSC1997] 选课(树形dp)

    题目链接 1 有前驱 2 有权值 可以联想到 是个森林结构 0代表空 如果把0看成根节点的话 就成了一个树 我们可以增加一个课容量 然后把0加入选课 就避免了森林结构 用前向星存图 把每个节点的子节点 ...

  4. 【NOI online 2】游戏【二项式反演】【树上背包】

    题意:一棵n=2mn=2mn=2m个点的树,mmm个白点和mmm个黑点.对于k∈[0,n]k\in [0,n]k∈[0,n],求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模9982 ...

  5. P4322 [JSOI2016]最佳团体(分数规划树上背包)

    P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...

  6. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)

    树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...

  7. 2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)

    2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包) 链接 题意:给出一个n个节点的树(n≤3000n\le3000n≤300 ...

  8. 树上背包 CF815C Karen and Supermarket

    CF815C Karen and Supermarket Description Karen有 b b b 美元,超市出售 N N N 种商品.第 i i i 件商品可以以 c i c_i ci​ 美 ...

  9. BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...

最新文章

  1. C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解
  2. chrome----timing含义解释
  3. go标准库的学习-encoding/json
  4. MSSQL Express版本自动备份数据库
  5. 【BZOJ3191】卡牌游戏,概率DP
  6. leetcode之旋转链表
  7. Flink 中的应用部署:当前状态与新应用模式
  8. 管理感悟:公司内斗,肯定是闲着的斗干活的
  9. 《嵌入式C语言自我修养》书评
  10. 对研发团队里技术分享的一些思考
  11. numpy的array()函数
  12. 开源crm系统VtigerCRM 7.3 保姆级安装教程
  13. Android Studio笔记4.2 安卓触摸事件
  14. 万字面试分享贴!从十二个角度解析面试全流程!附互联网公司Offer难度系数分析...
  15. 东方梦符祭服务器维护能玩吗,东方梦符祭新手经营攻略 东方梦符祭怎样玩
  16. IDEA 2021一键修改文件后缀名方法
  17. CMMI 3.0究竟有哪些变化?
  18. java怎么编写软键盘_输入法编程教程---软键盘(小键盘?)类,C++编写
  19. 笔趣阁小说-圣墟-爬虫源代码
  20. 网站会员与动网论坛会员同步整合非官方方法

热门文章

  1. 指标之王macd的使用方法
  2. 水位尺读数识别 python_一种基于视频的水尺读数检测方法与流程
  3. 特斯拉诉旗下二手分公司侵权;雷军晒与小米自动驾驶测试车合照;中国努力探索元宇宙“新蓝海” | 每日大事件...
  4. TexStudio中原先可正常编译的tex工程,现在却编译始终出错
  5. k8s篇-集群内的DNS原理与配置和K8s hosts 解析 HostAliases
  6. 呼叫中心中间件(mod_cti基于FreeSWITCH)-自动外呼接口
  7. 什么平台可以做直播教育呢
  8. 数据库实验2 数据库及数据库表的建立
  9. 猫猫学iOS之小知识之_xcode插件的删除方法_自动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自动提示,
  10. 头条搜索无法撼动百度,核心战场是内容分发