hdu1561 树形dp,依赖背包】的更多相关文章

多重背包是某个物品可以选择多次,要把对物品数的枚举放在对w枚举外面 分组背包是某组的物品只能选一个,要把对每组物品的枚举放在对w枚举内侧 依赖背包是多层的分组背包,利用树形结构建立依赖关系,每个结点都可以看做分组背包来做 /* dp[i][j]表示以点i为根,取j个点的状态 */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std…
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 3397    Accepted Submission(s): 1588 Problem Description Humans have discovered a kind of new metal mineral on Mars which are d…
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是一些树枝上长有苹果. 给定需要保留的树枝数量,求出最多能留住多少苹果. 输入输出格式 输入格式: 第1行2个数,N和Q(1<=Q<= N,1<N<=100). N表示树的结点数,Q表示要保留的树枝数量.接下来N-1行描述树枝的信息. 每行3个整数,前两个是它连接的结点的编号.第3个数是…
题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/1]表示在子树u中走j步的最大价值(回到u/不回到u).显然dp[u][j][1]>=dp[u][j][0],所以dp[1][m][1]就是最终答案. 假设v为u的子结点,k为到v且在v中所用步数,那么转移方程分3步,为: dp[u][j][0]=max(dp[u][j][0] , dp[u][j-…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最优值,那么dp[i][j]=max(dp[i][j],dp[son][k]+dp[i][j-k]) 其中son为i的儿子 然后从叶子节点往上进行背包即可 刚接触的同学会有疑问:就是不知道怎样将题目中的数据建为一个树,其实很简单,只要把0作为根结点即可 0节点的value初始化为0 然后dp[0][m…
Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡.你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?   Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表…
题目链接 输入:一棵树,每个节点一个权值. 输出:包括1号节点在内的m个节点组成的连通分量的权值和的最大值 hdu1561和hiho1055一样,只是变换了下说法 /**********************************************/ 计 dp(i,j) 为以i为根的子树选中j个点(包括i)时的最大权值和.则dp(1,m)即为所求. 方程: { dp[i][0] = 0; dp[i][1] = value[i]; foreach child c of i for j =…
#include<cstdio> #include<cstring> #include<iostream> #define INF 999999999 using namespace std; ; struct node { int to; int v; int next; }edge[MAXN*]; int pre[MAXN],n,index,vis[MAXN],m,num[MAXN]; int dp[MAXN][MAXN]; int max(int x,int y)…
题目大意:给出一片森林,总共有n个点,并且都有权值.从中选出m个,使权值和最大.其中,选某个节点之前必须先选其父节点. 题目分析:给所有的树都加一个共同的权值为0的根节点,使森林变成一棵树.定义状态dp(u,k)表示在以节点u为根节点的组中选k个节点的最大权值.则状态转移方程为: dp(u,k)=max(dp(u,k),dp(v,j)+dp(u,k-j),其中v是u的子节点. 代码如下: # include<iostream> # include<cstdio> # include…
题目链接 题意:给出一个树形结构,求P个节点的子树最少要去掉几条边 分析:DP[root][j] 表示 以第 root 个为根节点, 包含j 个节点需要去掉几条边.那么对于 root 这个根节点来说, 要么选择 他的一个 儿子 k, 要么不选择, 如果选择 dp[root][j] = min( dp[k][i] + dp[root][j - i] ), k为root的子节点, 其中  0 < i < j: 如果不选择的话,就去掉root 和 k之间连线,dp[root][j] = dp[roo…