ZOJ-3626 Treasure Hunt I 树形DP

很久很久以前有一个吸血鬼,每m天就会出现一次,把不在自己村子呆着的冒险家吃掉。有n个村子,n-1条道路,每个村子都有一定数量的财富,默认探险家刚一到达一个村子就能获得财富,给出探险家的出生的村子和多少天后吸血鬼出现。

要求在吸血鬼出现之前赶回自己的村子,其实就是求一棵以k为根的各点权值之和最大且各边权加起来<=m/2的子树。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <ctime>
#include <vector>
#include <algorithm>
#define LL __int64
#define inf 1<<29
using namespace std;
struct Edge
{
	int v,next;
	int len;
}edge[1000];
int num;
int head[1000];
void addedge(int u,int v,int len)
{
	edge[num].v=v;
	edge[num].len=len;
	edge[num].next=head[u];
	head[u]=num++;
	edge[num].v=u;
	edge[num].len=len;
	edge[num].next=head[v];
	head[v]=num++;
}
int a[222];
int dp[222][222];
int n,m,k;
void dfs(int root,int father,int d)
{
	for(int i=head[root];i!=-1;i=edge[i].next)
	{
		int v=edge[i].v;
		int len=edge[i].len;
		if(v==father)
		{
			continue;
		}
		dfs(v,root,d-len);
		for(int j=d;j>=0;j--)
		{
			for(int k=0;k+len<=j;k++)
			{
				if(dp[v][k]!=0&&dp[root][j-k-len]!=0)
				{
					dp[root][j]=max(dp[root][j],dp[root][j-k-len]+dp[v][k]);
				}
			}
		}
	}
}
int main()
{
	int u,v,len;
	while(scanf("%d",&n)!=EOF)
	{
		memset(dp,0,sizeof(dp));
		memset(head,-1,sizeof(head));
		num=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			dp[i][0]=a[i];
		}
		for(int i=1;i<n;i++)
		{
			scanf("%d%d%d",&u,&v,&len);
			addedge(u,v,len);
		}
		scanf("%d%d",&k,&m);
		m/=2;
		dp[k][0]=a[k];
		dfs(k,-1,m);
		int ans=-1;
		for(int i=0;i<=m;i++)
		{
			if(dp[k][i]>ans)
			{
				ans=dp[k][i];
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
时间: 2024-11-05 14:54:36

ZOJ-3626 Treasure Hunt I 树形DP的相关文章

[zoj 3626]Treasure Hunt I 树DP

<span style="font-family: Arial, Helvetica, Verdana, sans-serif; background-color: rgb(255, 255, 255);">Treasure Hunt I</span> Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous country since a bloodsucker living

zoj 3626 Treasure Hunt I (树形dp)

题目大意: 给出一棵树,求出从起点开始走m长度最后回到起点,所能得到的宝藏的最大价值. 思路分析: 通过一次dfs可以得到的是子树到根节点的所有距离的最大值. 现在的问题就是他走完一颗子树可以去另外一颗子树. 所以在回溯到根的时候要统计其他子树上互补距离的最大值. dp[i] [j] 表示i为根节点,在i的子树中走j步然后回到i所能拿到的最大价值. 转移方程就是 dp[x][i+2*len]=max(dp[x][i+2*len],dp[v][j]+dp[x][i-j]); v为x的子树的根,le

ZOJ 3626 Treasure Hunt I(树形dp)

Treasure Hunt I Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous country since a bloodsucker living there. Sometimes the bloodsucker will appear and kill everyone who isn't at his hometown. One day, a brave person named CC finds

zoj 3629 Treasure Hunt IV 打表找规律

H - Treasure Hunt IV Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Alice is exploring the wonderland, suddenly she fell into a hole, when she woke up, she found there are b - a + 1 treasures labled a from b in

zoj 3629 Treasure Hunt IV(找规律)

Alice is exploring the wonderland, suddenly she fell into a hole, when she woke up, she found there are b - a + 1 treasures labled a fromb in front of her.Alice was very excited but unfortunately not all of the treasures are real, some are fake.Now w

ZOJ 3201 Tree of Tree (树形DP)

题意:给定一棵树,求大小为k的一个子树的最大权值. 析:dp[i][j] 表示以 i 为根大小为 j 时最大权值.dp[i][j] = max{dp[i][j-k] + dp[son][k]},状态方程. 有一个要注意,因为要选的是一棵子树,所以以哪个点为根都行,也就是说,对于任意子树都能找一个合适的根,使得不会出现父结点与子结点冲突. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <

ZOJ 3627 Treasure Hunt II (贪心,模拟)

题意:有n个城市并排着,每个城市有些珠宝,有两个人站在第s个城市准备收集珠宝,两人可以各自行动,但两人之间的距离不能超过dis,而且每经过一个城市就需要消耗1天,他们仅有t天时间收集珠宝,问最多能收集多少珠宝? 思路: 其实就是类似一个滑动窗口在收集一个序列上的权值.首先两个人可以同时往两边散开,直到极限距离dis(这样省时),然后他们可能往左/右走,也可能往左走一会儿再往右走,也可能往右走一会儿再往左走.可以看出其实这些考虑都是对称的,那么我们主要考虑1边就行了.可以尝试枚举往左边走k天,其他

【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock&#39;s blog】

树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AVL树,线段树.SPLAY树,后缀树等等.. 枚举那么多种数据结构只是想说树方面的内容相当多,本专辑只针对在树上的动态规划,即树形DP.做树形DP一般步骤是先将树转换为有根树,然后在树上进行深搜操作,从子节点或子树中返回信息层层往上更新至根节点.这里面的关键就是返回的信息部分,这个也没一般性的东西可讲

【树形dp】Treasure Hunt I

[ZOJ3626]Treasure Hunt I Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous country since a bloodsucker living there. Sometimes the bloodsucker will appear and kill everyone who isn't at his hometown. One day, a brave person named