洛谷 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题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...
随机推荐
- application和javaBean练习
编写一个jsp程序,实现将用户信息保存在application对象的用户注册 package com.sp.test; public class User { private String usena ...
- JavaScript 基础 if switch 弹窗 运算符
脚本语言最重要的几个部分: 数据类型 运算符 控制语句 数组 方法(函数) 一.基础知识 关键字:系统定义 有意义的名字如 background link 等 标识符:自己定 比如class的名字a ...
- 最长公共子序列(稀疏序列)nlogn解法
首先这种做法只能针对稀疏序列, 比如这种情况: abc abacabc. 会输出5 ,,,,就比较尴尬, #include<iostream> #include<cstdio> ...
- bind方法使用案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SGU 180 Inversions【树状数组】
题意:求逆序数 和POJ那题求逆序数的一样,不过这题离散化之后,要去一下重,然后要开到long long #include<iostream> #include<cstdio> ...
- HDU 1338 Game Prediction【贪心】
解题思路: 给出 n m 牌的号码是从1到n*m 你手里的牌的号码是1到n*m之间的任意n个数,每张牌都只有一张,问你至少赢多少次 可以转化为你最多输max次,那么至少赢n-max次 而最多输max ...
- lsof 命令简介
losf 命令可以列出某个进程打开的所有文件信息.打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明管道,符号链接,Socket流,网络Socket,UNIX域So ...
- FCC高级编程之Inventory Update
Inventory Update Compare and update the inventory stored in a 2D array against a second 2D array of ...
- redis.conf配置文件配置项解析
知识来源于 : https://blog.csdn.net/bsfz_2018/article/details/79061413[Redis在linux下的安装] daemonize:如需要在后台运行 ...
- 学习参考:《Python语言及其应用》中文PDF+英文PDF+代码
学习简单的数据类型,以及基本的数学和文本操作,学习用Python内置的数据结构来处理数据: 掌握Python的代码结构和函数的用法:使用模块和包编写大规模Python程序:深入理解对象.类和其他面向对 ...