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

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

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

所以这是一颗树

这题和上一道题比较相似

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

但这道题是多叉树

这里有多个根,那就加一个编号为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. App.config配置详解

    经上一篇文章https://www.cnblogs.com/luna-hehe/p/9104701.html发现自己对配置文件很是不了解,同样还是查了半天终于发现另一片宝贵文档https://www. ...

  2. 机器学习(十一) 支持向量机 SVM(下)

    支持向量机通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间.特征空间的维数可能非常高.如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高 ...

  3. String Comparison(C#)

    When comparing programmatic strings, you should always use StringComparison.Ordinal or StringCompari ...

  4. C语言-实现字符串倒序输出

    方法1: Action(){//倒序输出 char *src="abcdefgh123"; char *desc; desc=(char *)malloc(100*sizeof(c ...

  5. git pull 失败 ,提示:fatal: refusing to merge unrelated histories

    首次 git pull 时失败,并提示:fatal: refusing to merge unrelated histories 在使用git pull 命令时,添加一个可选项 git pull or ...

  6. asp.net core 与EFcore 入门

    什么是EFcore? Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术,EF Core 可用作对象关系映射程序 ( ...

  7. 网页结构的简介和Xpath语法的入门教程

    相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式.BS4.Xp ...

  8. 洛谷P3834 【模板】可持久化线段树 1 主席树

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 2000000 ...

  9. BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)

    1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 798[Submit][Stat ...

  10. nyoj33 蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.比如n=4时方陈为: 10 11 12 1 9 16 ...