The more, The Better(hdu1561)】的更多相关文章

[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 Anniversary party 给一颗关系树,各点有权值.选一些点出来.任一对直接相连的边连接的点不能同一时候选择,问选择出的权值和最大为多少. 考虑以u为根的子树能够选择的方法,dp[u]表示选择u时能获得最大收益.dp2[u]表示不选u时能获得的最大收益.则u不选时,为dp2[u]=max{dp…
HDU1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8490    Accepted Submission(s): 4964 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城…
题目链接 输入:一棵树,每个节点一个权值. 输出:包括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 =…
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define ll long…
#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个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过各自分配若干的城堡去攻克转移的,一个排列组合数,阶乘,是指数级的时间复杂度! 看了题解,原来这是依赖背包,没看背包九讲..不过网上的博客似乎没说清楚,事实上这个状态应该是三个维度来表示: dp[u][…
题目大意:给出一片森林,总共有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…
有的堡垒攻克需要攻克另一个堡垒,形成一个森林,最多攻克m个堡垒,求获得宝物的最大价值. 1,以0做根将森林形成树: 2,用背包计算当前节点下需要攻克k个堡垒能获得的宝物最大价值,但是注意同一个根节点的情况不能够先后放入背包,否则会有比如1节点选2个和选三个形成了选5个,也就是某些节点重复计算了.所以要在back第j格时将所有种k依次放入,j--: #include<iostream> #include<string.h> #include<stdio.h> #inclu…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:n座城堡,每个里面都有宝物,要求在你可以攻占m个城堡得到的最多的宝物,但是如果要攻破一个城堡,必须要攻破它依赖的那个城堡,例如,如果a依赖b,那么如果想要攻破a就必须先攻破b. 分析:首先根据依赖关系构建出一棵以0为根节点的树,那么按从上往下的顺序攻取,除了0节点外,在攻取它的子节点前必须先占领了根节点.dp[u][j]表示以u为根节点占领了j个节点取得的最大值,因此:dp[u][j]=…
给定n,m表示n个城堡,我们可以选择攻占m个城堡.要使得价值最大 接下来n行 a b,   第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡 如果有多个a=0的点,那么就不是一棵树,但是我们可以建立一个根结点0,让根结点指向那些a=0的点,  同时m++,因为更结点必须被占据,占据一个结点需要一个容量 每个结点可以选或者不选,但是如果选,当且仅当父亲结点也被选. 所以是树上面的01背包问题,所以只要在每个结点处枚举当前容量和孩子的容量,算出各个容量的最大值. 状态转移方程见代…