洛谷 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题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...
随机推荐
- navigator.clipboard 浏览器原生剪贴板
浏览器原生剪贴板 navigator.clipboard 写入 navigator.clipboard.writeText navigator.clipboard.writeText('Linr Te ...
- layui layer 弹框
layer 这个是一个web弹层组件,挺好用的...然后项目框架是SSM... layer.open主要是用来弹出来一个iframe弹窗,然后用来展示数据也行,用来修改也行,这次记录的主要是展示,展示 ...
- C++调用约定和名字约定 thiscall
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...
- + (void)initialize vs 静态构造方法
在继承体系中,多个子类的引用,父类缺省执行一次: 特殊情况: 1)子类没有实现.调用父类方法: 2)子类显示调用父类: 3)存在分类实现,分类实现覆盖本体. Initializes the class ...
- ActiveMQ学习笔记(20)----Consumer高级特性(二)
1. Message Selectors JMS Selectors 用在获取消息的时候,可以基于消息属性和Xpath语法对消息进行过滤.JMS Selectors有SQL92语义定义.以下是个Sel ...
- Js中遇到的坑点汇总
一.Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug 解决思路: 1.去掉overflow属性 2. Android 手机下, input 或 textarea 元素聚焦时, 主动 ...
- [HAOI2009]毛毛虫(树形dp)
[HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫 ...
- 配置oh-my-zsh
1. 当使用zsh进入庞大的git工程目录下时,会发生cd命令很慢的情况 可以把~/.oh-my-zsh/lib/git.zsh里面的git_prompt_info函数替换为 function git ...
- spring boot启动STS 运行报错 java.lang.NoClassDefFoundError: ch/qos/logback/classic/LoggerContext
spring boot启动STS 运行报错 java.lang.NoClassDefFoundError: ch/qos/logback/classic/LoggerContext 学习了: http ...
- Maven配置Spring+SpringMVC+MyBatis(3.2.2)Pom 以及 IntelliJ IDEA 怎样打开依赖视图
Maven配置Spring+SpringMVC+MyBatis(3.2.2)Pom 配置原则: 利用依赖,将所需的jar包加载到project中. 先依赖主要jar包 Spring + Spring ...