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]); 
	}
}


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

相关文章推荐

HDU 1561 The more, The Better(树形DP入门)

HDU 1561 The more, The Better(树形DP入门)

hdu 1561 The more, The Better(树形DP入门)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • caduca
  • caduca
  • 2014年09月03日 20:53
  • 443

hdu 1561 (树形dp)The more, The Better

dp的思想方法,就是每个状态有很多个策略,然后怎么选择才是最优的。此时,假设它的所有后续状态的所有最优值已经计算出来。 那么,树形dp同样如此。 当到达一个节点i时,剩下j的容量,总共有x个子节点...

[hdu1561] The more, The Better 【树形DP】

Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接...

HDU 1561 The more, The Better 树形DP

题目描述:Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城...

hdu1561树形dp

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...

hdu 1561The more, The Better(树形dp&01背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • opm777
  • opm777
  • 2014年05月09日 13:23
  • 916

(树形dp 依赖背包)hdu1561

#include #include using namespace std ; const int maxn = 200+10 ; const int root = 0; //所有森林...
  • zjc0230
  • zjc0230
  • 2013年10月27日 18:22
  • 309

hdu 1561 The more, The Better(树形DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000...

hdu 1561 The more, The Better(树形dp+01背包)

The more, The Better Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1561 树形dp 入门教学
举报原因:
原因补充:

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