洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课
这里的先后关系可以看成节点和父亲的关系
在树里面,没有父亲肯定就没有节点
所以我们可以先修的看作父亲,后修的看作节点
所以这是一颗树
这题和上一道题比较相似
都是求树上最大点权和问题
但这道题是多叉树
这里有多个根,那就加一个编号为0的根,价值为0, 同时m要+1(因为这个虚拟的 根一定要取)
解法两种
(1)转二叉树
左儿子右兄弟可以转二叉树
这篇博客讲得很好
https://blog.csdn.net/c20190102/article/details/69946551
注意这里转后有“后遗症”
对于当前节点,左节点是原图中的儿子,右节点是原图中的兄弟
所以分三种情况
(1)只选儿子, 此时
(2) 选兄弟和儿子,此时
(3)只选兄弟 此时
#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 312;
struct tree
{
int l, r, d, c;
tree() {l = r = -1; c = 0; }
}a[MAXN];
int f[MAXN][MAXN], n, m;
int dfs(int i, int j)
{
if(i < 0) return 0;
int& ans = f[i][j];
if(ans != -1) return ans;
REP(k, 0, j) //k = j - 1时是只选儿子,其他时候儿子兄弟都选
ans = max(ans, dfs(a[i].l, k) + dfs(a[i].r, j-k-1) + a[i].c);
ans = max(ans, dfs(a[i].r, j)); //只选兄弟
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
REP(i, 1, n + 1)
{
int x;
scanf("%d%d", &x, &a[i].c);
if(a[x].l == -1) a[x].l = i;
else a[a[x].d].r = i;
a[x].d = i;
}
memset(f, -1, sizeof(f));
REP(i, 0, n + 1) f[i][0] = 0;
printf("%d\n", dfs(0, m + 1));
return 0;
}
(2)树上背包
在树上做多重背包
可以设f[i][j]为以i为根的字树取j个节点(包括i)的最大权值
那么可以初始化为
然后枚举左右节点的个数取max
#include<cstdio>
#include<vector>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 212;
int f[MAXN][MAXN], cnt[MAXN], n, m, x;
vector<int> g[MAXN];
void dfs(int u)
{
cnt[u] = 1;
REP(i, 0, g[u].size())
{
int v = g[u][i];
dfs(v);
cnt[u] += cnt[v];
for(int j = cnt[u]; j >= 1; j--)
for(int k = 0; k <= min(j - 1, cnt[v]); k++)
f[u][j] = max(f[u][j], f[u][j-k] + f[v][k]);
}
}
int main()
{
scanf("%d%d", &n, &m);
REP(i, 1, n + 1)
{
scanf("%d%d", &x, &f[i][1]);
g[x].push_back(i);
}
dfs(0);
printf("%d\n", f[0][m+1]);
return 0;
}
洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课的更多相关文章
- 洛谷 P2014 选课(树形背包)
洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的 ...
- 树形DP 洛谷P2014 选课
洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 洛谷 P1273 有线电视网(树形背包)
洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 2021.08.05 P1738 洛谷的文件夹(树形结构)
2021.08.05 P1738 洛谷的文件夹(树形结构) P1738 洛谷的文件夹 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树!! 题意: 给出n个网页路径,求 ...
- 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)
洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...
随机推荐
- 【转】IIS初始化(预加载),解决第一次访问慢,程序池被回收问题
原地址:http://www.debugrun.com/a/mpyWXwg.html 读在最前面: 1.本文以IIS8,Windows Server 2012R2做为案例 2.IIS8 运行在 Win ...
- Gulp 相关
获取执行在文件列表: http://www.thinksaas.cn/ask/question/21950/ 用through2这个插件. var through = require('through ...
- .NET深入解析LINQ框架1
1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 ( ...
- HDU 3015 Disharmony Trees 【 树状数组 】
题意:给出n棵树,给出横坐标x,还有它们的高度h,先按照横坐标排序,则它们的横坐标记为xx, 再按照它们的高度排序,记为hh 两颗树的差异度为 abs(xx[i] - xx[j]) * min(hh[ ...
- tp框架--------where("1")
今天看代码的时候看到一个令我难以理解的sql查询语句,这是tp框架里的 return $this->where("1")->order('ar_id desc')-&g ...
- 3ds Max 2018 在安装后无法启动或出现不稳定
问题: 安装 3ds Max 2018 后,软件无法正常启动,或在打开后不久出现不稳定和崩溃. 原因: 有多种原因可能会导致这些错误: ▪ 3ds Max.Windows 更新和 ProSound.d ...
- How Javascript works (Javascript工作原理) (六) WebAssembly 对比 JavaScript 及其使用场景
个人总结: 1.webassembly简介:WebAssembly是一种用于开发网络应用的高效,底层的字节码.允许在网络应用中使用除JavaScript的语言以外的语言(比如C,C++,Rust及其他 ...
- POJ 1742 Coins(多重背包?)
题解 一个自然的思路是对于每一个物品做一次01背包 然后T飞了. 试着用二进制拆分,还是T了. 单调队列,对不起,懒,不想写. 我们这样想.设dp[i]代表i这个面值前几种硬币是否能凑到 然后对于每一 ...
- [vue插件]基于vue2.x的电商图片放大镜插件
最近在撸一个电商网站,有一个需求是要像淘宝商品详情页那样,鼠标放在主图上,显示图片放大镜效果,找了一下貌似没有什么合适的vue插件,于是自己撸了一个,分享一下.小白第一次分享,各位大神莫见笑. vue ...
- C++根据扩展名获取文件图标、类型
简述 在Windows系统中,根据扩展名来区分文件类型,比如:.txt(文本文件)..exe(可执行程序).*.zip(压缩文件),下面,我们来根据扩展名来获取对应的文件图标.类型. 简述 源码 源码 ...