CH 5402 选课(分组背包+树形DP)
CH 5402 选课

$ solution: $
最近真是!越做题越觉得自己弱。这道题比较综合,它将有向树和背包结合,完全刷新世界观。首先我们可以发现这些课程显然不能随意调动顺序来背包,他们之间的关系可以用一颗有向树来表示(每一个节点代表一门课程,要选这门课程必须将它的祖先全都选了),但是这些树可能是分开的一片森林,所以我们可以建一个虚点将所有的没有父亲的根连在一起。这样我们发现我们直接从根开始背包是很没有思路的,后效性非常多。于是我们按照DP的一般规律从已知到未知,先从叶子节点开始由小树到大树。我们在某一棵子树上完全背包时就不必去管之前的必要课程,然后以每一个节点都来一次分组背包也满足有局部的最优解扩散到整体上去。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
int n,m,ff,top;
int a[305];
int f[305][305];
int tou[305];
struct su{
int to,next;
}b[305];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline void add(int x,int y){
b[++top].to=y; b[top].next=tou[x]; tou[x]=top;
}
inline void dfs(int i){
for(rg j=tou[i];j;j=b[j].next){
rg to=b[j].to; dfs(to);
for(rg p=m;p>0;--p)
for(rg q=0;q<p;++q)
f[i][p]=max(f[i][p],f[i][q]+f[to][p-q]);
}if(i)for(rg k=m;k>0;--k)f[i][k]=f[i][k-1]+a[i];
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); m=qr();
for(rg i=1;i<=n;++i)
add(qr(),i),a[i]=qr();
dfs(0); printf("%d\n",f[0][m]);
return 0;
}
CH 5402 选课(分组背包+树形DP)的更多相关文章
- P1273 有线电视网[分组背包+树形dp]
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- HDU 4003 Find Metal Mineral(分组背包+树形DP)
题目链接 很棒的一个树形DP.学的太渣了. #include <cstdio> #include <string> #include <cstring> #incl ...
- hdu 1561 The more, The Better (依赖背包 树形dp)
题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...
- P2014 选课 题解(树形DP)
题目链接 P2014 选课 解题思路 树形动归,用\(f[i][j]\)表示以\(i\)为根,\(j\)个子节点(不包括自己)的最大学分 首先根据题意建图,用根节点\(0\)将森林连成树. 从根节点开 ...
- 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)
题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...
- CTSC1998 选课(背包类树形Dp)
题意: 给出 n 节课的先修课号以及学分(先修课号指的是在学习某节课时先需要学习的课程),求学 m 节课的最大学分. 细节: 1.对于课程 a 其先修课号为 b ,对于课程 b 其先修课号为 c ,则 ...
- HDU 1561 The more, The Better (有依赖背包 || 树形DP)
题目链接 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位 ...
- HDU4003Find Metal Mineral[树形DP 分组背包]
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- joyOI 选课 【树形dp + 背包dp】
题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...
随机推荐
- shell的格式化输出命令printf
printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...
- Linux 查看端口占用并杀掉进程
1. 查看端口号占用情况: netstat -apn|grep 11305 tcp 0 0 10.65.42.27:80 172.22.142.20: ...
- 怎么用SQL语句查数据库中某一列是否有重复项
SELECT 某一列, COUNT( 某一列 ) FROM 表 GROUP BY 某一列 HAVING COUNT( 某一列 ) 〉1 这样查询出来的结果, 就是 有重复, 而且 重复的数量.
- 从Java看数据结构之——树和他的操作集
写在前面 树这种数据结构在计算机世界中有广泛的应用,比如操作系统中用到了红黑树,数据库用到了B+树,编译器中的语法树,内存管理用到了堆(本质上也是树),信息论中的哈夫曼编码等等等等.而树的实现和他的操 ...
- jquery+css实现邮箱自动补全
今天在公司做一个电子商务网站的注册会员时,要求用户在电子邮箱文本框中输入时,给与热点提示常用的电子邮箱,帮助用户选择,提高体验效果.下面是用Jquery+css实现的邮箱自动补全,供大家参考和学习. ...
- 使用git 高效多人合作
复习一下... 附加学习链接: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/) ...
- Matlab多项式拟合測试
x=0:0.2:4; %生成等差数列 rnd=rand(1,size(x,2))*5; %生成一组随机数 y=x.*x.*x+x.*x+6+rnd; %生成y=x^3+x^2+6函数在垂直方向5个尺度 ...
- how to avoid over-fitting?(机器学习中防止过拟合的方法,重要)
methods to avoid overfitting: Cross-Validation : Cross Validation in its simplest form is a one roun ...
- awk批量处理文件,对第一列去重并,累加第二列数值,打印一二列存入新文件
awk '{if(NR>1)a[$1]+=$2}END{for(i in a)printf "%s\t %d\n",i,a[i]}' querylog* > total ...
- People seldom do what they believe in. They do what is convenient, then repent.
People seldom do what they believe in. They do what is convenient, then repent. 人们很少真正实践他们的理想.他们只做比较 ...