hdu 1561 树形dp 入门教学

原创 2015年11月20日 17:25:49

第一次遇到树形DP,研究了很久。

#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h> 
using namespace std;
int m,n,value[205],dp[205][205];//dp[i][j]表示从根节点i出发,攻占j个城堡所能得到的最大价值。
vector<int>list[205];
void DFS(int root,int M)
{
	int i,j,k;
	int len = list[root].size();
	dp[root][1] = value[root];//只占领根节点的情况
	for(i = 0; i < len; i++)//从只有一个子节点的情况开始计算,一直递推到有len个子节点的情况
	{
		if(M > 1) DFS(list[root][i],M-1);
		for(j=M; j > 1; j--)//从root开始(包括攻击root),攻击M个城堡的情况
		{
			for(k = 1; k < j; k++)//k表示攻击以i为根节点的树的次数
			{
				if(dp[root][j] < dp[root][j - k] + dp[list[root][i]][k])
				dp[root][j] = dp[root][j - k] + dp[list[root][i]][k];
			}
		}
	}
}
int main()
{
	int i,j,fa;
	while(scanf("%d%d",&n,&m),m || n)
	{
		memset(dp,0,sizeof(dp));
		memset(value,0,sizeof(value));
		for(i = 0; i <= n; i++)
		{
			list[i].clear();
		}
		for(i = 1; i <= n; i++)
		{
			scanf("%d%d",&fa,&value[i]);
			list[fa].push_back(i); //将i保存为一个fa的子节点。
		}
		DFS(0,m+1);//这里要m+1而不是m,是因为我们自己额外添加了一个本来不存在的 城堡0,其价值为0,并且是整棵树的根节点。
		printf("%d\n",dp[0][m+1]); 
	}
}


版权声明:转载注明出处。有任何疑问可留言。

HDU1520(树形dp入门题)

题意:在一个有根树上每个节点有一个权值,每相邻的父亲和孩子只能选择一个,问怎么选择总权值之和最大。思路: 树形dp的常规入门题:设dp[i][0]表示:当前这个点不选,dp[i][1]表示当前这个点...
  • yexiaohhjk
  • yexiaohhjk
  • 2016年09月28日 21:40
  • 807

hdu3899(树形dp)

链接:点击打开链接 题意:给出一棵树每个点的权值和每条边的长度,点j到点i的代价为点j的权值乘以连接i和j的边的长度,输出点x,使得所有点到x点的代价最小 代码:#pragma comment(lin...
  • stay_accept
  • stay_accept
  • 2016年07月31日 17:08
  • 297

HDU 6201transaction 【树形DP】

2017 ACM/ICPC Asia Regional Shenyang Online transaction transaction transaction Time Limit: 4000/2...
  • m0_37953323
  • m0_37953323
  • 2017年09月10日 18:02
  • 278

树形动态规划(树状DP)小结

树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索...
  • txl16211
  • txl16211
  • 2015年04月29日 23:10
  • 9894

hdu1520(树形dp入门)

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
  • martinue
  • martinue
  • 2016年03月14日 13:21
  • 273

HDU 6161 树形DP + 优化

树形DP + 优化题意:​ 有n个节点标号1~n,根据其公式建树,每个节点有权值最开始就是标号本身,有两种操作,分别是: 修改u节点的值为v 问经过u节点的路径中最大的权值和是多少 思路:​ ...
  • Since_natural_ran
  • Since_natural_ran
  • 2017年08月23日 20:28
  • 340

HDU 1561 树形DP

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • mkandysylove
  • mkandysylove
  • 2015年11月10日 22:42
  • 65

hdu 1561 树形dp

http://acm.hdu.edu.cn/showproblem.php?pid=1561 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图...
  • u013573047
  • u013573047
  • 2015年02月09日 19:23
  • 644

树形动态规划(树形DP)入门问题—初探 & 训练

树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的...
  • txl16211
  • txl16211
  • 2015年04月29日 22:40
  • 9998

hdu 1561(树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路:dp[u][i]表示以u为根的树选了i个子节点。 1 #include ...
  • zjsyhjh
  • zjsyhjh
  • 2014年05月26日 18:06
  • 226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1561 树形dp 入门教学
举报原因:
原因补充:

(最多只允许输入30个字)