这里的先后关系可以看成节点和父亲的关系

在树里面,没有父亲肯定就没有节点

所以我们可以先修的看作父亲,后修的看作节点

所以这是一颗树

这题和上一道题比较相似

都是求树上最大点权和问题

但这道题是多叉树

这里有多个根,那就加一个编号为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:选课的更多相关文章

  1. 洛谷 P2014 选课(树形背包)

    洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的 ...

  2. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  3. 【BZOJ2830/洛谷3830】随机树(动态规划)

    [BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...

  4. 洛谷 P1273 有线电视网(树形背包)

    洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...

  5. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  6. 2021.08.05 P1738 洛谷的文件夹(树形结构)

    2021.08.05 P1738 洛谷的文件夹(树形结构) P1738 洛谷的文件夹 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树!! 题意: 给出n个网页路径,求 ...

  7. 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)

    题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...

  8. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  9. 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)

    洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...

随机推荐

  1. asp.net mvc5 文件下载上传

    下载:是通过点击a标签直接下载的方式,没有其他任何要求,在服务器上存在实体文件,不需要请求后台控制层 前段js: <a id="NF-DownLoad" authorize= ...

  2. hdu 1051 - 贪心,水题

    题目链接 一堆小木棍,每个有两个属性值(l,w),对小木棍分组,每一组内的小木棍存在这样一个序列满足s1<=s2<=s3.....<=sn,[s1<=s2当且仅当s1.l< ...

  3. 1,http协议的细节部分学习

    http协议(80端口)https(443端口) 主要是一直对三次握手模模糊糊,并且抓包的时候不知道那些Accept.User-Agent什么意思,就仔细找课程学了一下. 学习简介: 1,涉及工具(w ...

  4. gcd的queue与group

    queue相当于事件处理机制里的事件池:只是任务池: 线程作为事件处理的实施者,由线程池从任务池中获取任务进行调度派发: group相当与工作组,按照任务的相关性对任务进行组织.

  5. 大数相乘(牛客网ac通过)

    2019-05-172019-05-17 大数相乘基本思想: 相乘相加,只不过大于10先不进位到计算完后统一进位 #include <iostream> #include <stri ...

  6. 字符串格式时间转Date格式

    /** * 字符串时间格式转 Date 格式 * @param strDate * @return */ public static Date getDateTimeByStringTime(Stri ...

  7. Base64编码字符串时数据量明显变大

    那就是当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需 ...

  8. nginx编译支持HTTP2.0

    nginx编译支持HTTP2.0 nginx编译支持HTTP2.0 wget https://www.openssl.org/source/openssl-1.1.0i.tar.gz #openssl ...

  9. 题解 P2532 【[AHOI2012]树屋阶梯】

    本题运用卡特兰数求解. 卡特兰数有两种表达方式: 1)\(h_i=\sum^{k=0}_{i-1}h_kh_{i-k-1}\) 2)\(h_i=\frac{1}{n+1}C^{n}_{2n}\) 运用 ...

  10. SNMP学习

    http://blog.sina.com.cn/s/blog_4502d59c0101fcy2.html 简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被In ...