题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044

题目大意:给定n个节点组成的树,1为敌方基地,叶子结点为我方结点。我们可以在每个结点安放炮台,至多一炮,然后就可以打炮,每个结点有ki种炮,每种炮有一个花费和一个能量(能量对应着打掉敌人多少hp)。敌人可能往一个结点的每条分支跑,所以要想保证守住阵地,就要保证每个分支都要安放炮台。最后问怎么打炮,才能使打掉的敌人hp最多。

参考链接:http://blog.csdn.net/woshi250hua/article/details/7683765

这道题敌人走的是随意路线,意味着要所有叶子节点中最小的那条路线要越大越好。所以dp[fa][j]保存的是fa结点到所有叶子节点中最小值。

给的费用是定值,首先遍历得到tp[i][j],表示i结点j费用最大的价值。

然后dfs,给叶子节点赋值,非叶子节点为INF(为了得到叶子节点的信息),叶子节点遍历完后才加上根节点的值。具体看代码

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 1000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f int n,m; struct node{int y,val,next;}tree[MAXN<<]; int head[MAXN],vis[MAXN],ptr=,dp[MAXN][MAXN]; int price[MAXN][MAXN],power[MAXN][MAXN],a[MAXN],tp[MAXN][MAXN]; void init()
{
mem(head,-);
mem(vis,);
mem(dp,INF);
mem(tp,);
ptr=;
}
void add(int x,int y)
{
tree[ptr].y = y;
tree[ptr].next = head[x];
head[x] = ptr++;
} void dfs(int rt,int fa)
{
vis[rt]=;
//pf("t%d %d\n",rt,head[rt]);
if(head[rt]==-)
{
for(int i = m;i>=;i--)
{
dp[rt][i] = tp[rt][i];
//pf("r%d %d %d\n",rt,i,dp[rt][i]);
}
return;
} for(int i = head[rt];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(vis[y]) continue;
dfs(y,rt);
for(int j=m;j>=;j--)
{
int t = ;
for(int k=;k<=j;k++)
{
t = max(t,min(dp[rt][j-k],dp[y][k]));
}
dp[rt][j] = t;
}
} for(int j = m;j>=;j--)
{
for(int k=;k<=j;k++) dp[rt][j] = max(dp[rt][j],dp[rt][j-k]+dp[rt][k]);
}
} int main()
{
int i,j,k,t;
sf("%d",&t);
while(t--)
{
init();
sf("%d",&n);
for(i=;i<n;i++)
{
int x,y;
sf("%d%d",&x,&y);
add(x,y);
}
sf("%d",&m);
for(i=;i<=n;i++)
{
sf("%d",&a[i]);
for(j=;j<=a[i];j++)
{
sf("%d%d",&price[i][j],&power[i][j]);
tp[i][price[i][j]] = max(tp[i][price[i][j]],power[i][j]);
}
} for(i=;i<=n;i++)
{
for(j=;j<=m;j++) tp[i][j] = max(tp[i][j],tp[i][j-]);
}
dfs(,);
pf("%d\n",dp[][m]);
}
}

还有第二个解法,多叉树转二叉树:

http://blog.csdn.net/shuangde800/article/details/10523547

hdu 4044 树形DP 炮台打怪 (好题)的更多相关文章

  1. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  2. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  3. 刷题总结——Tree chain problem(HDU 5293 树形dp+dfs序+树状数组)

    题目: Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There ar ...

  4. HDU - 1520 树形DP入门题

    写了两种DP,第一种是按照自己习惯来xjb敲的,第二种参考别人 熟悉一下树形DP的套路 dp[i][]是维护i及以下的关系最优值的,所以我觉得两次DP记忆搜索之间不清-1应该是正确的(也就做了一次加法 ...

  5. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

  6. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  7. HDU 1561 树形DP入门

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

  8. codevs 1380/HDU 1520 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...

  9. HDU 5834 [树形dp]

    /* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...

随机推荐

  1. Airtest中pcoc的常用方法

    a=poco(resourceId="com.wuba.zhuanzhuan:id/a0q").get_text() #获取resourceId文字信息(用于界面有text元素的) ...

  2. 【TED演讲】阿帕玛・饶:(幽默的高科技艺术)

    身为艺术家和TED Fellow的阿帕玛・饶对熟悉的事物以惊奇的幽默的方式进行再次想像.通过和索伦・普尔兹的合作,她创作出一系列高科技的艺术作品-一个会发邮件的打字机,一个让你在屏幕上消失而跟踪拍摄你 ...

  3. ASP.NET-GridView分页排序显示

    前期我们分别介绍了gridview怎么进行固定表多行数据显示,以及怎么设计花样表头.下面我们介绍怎么利用gridview进行分页显示的同时还可以进行排序显示. 显示效果 前端DEMO <span ...

  4. 从100PV到1亿级PV网站架构演变(转)

    http://www.linuxde.net/2013/05/13581.html 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不同的方法,不同的方法下有共同的原 ...

  5. ios swift4之kvo的使用

    在swift4之前,使用kvo只需要继承NSObject 就可以了.但是swift4之后发生了变化,必须在class之前加入@objcMembers修饰,不然就没有效果了. 下面举个例子:如定义一个P ...

  6. SP18637 LAWRENCE - Lawrence of Arabia

    \(\color{#0066ff}{ 题目描述 }\) 给定一个长度为n的序列,至多将序列分成m+1段,每段序列都有权值,权值为序列内两个数两两相乘之和.求序列权值和最小为多少? \(\color{# ...

  7. [转载]C#实现获取浏览器信息

      原文地址:C#实现获取浏览器信息作者:flywithme Request.Browser.MajorVersion.ToString();//获取客户端浏览器的(主)版本号 Request.Bro ...

  8. 洛谷 P1028 数的计算

    嗯... 首先这道题想到的就是递推.... 但是递推失败 (不知道自己是怎么想的 然后又想打一个暴力,但是数的最高位太难存储了,所以又放弃了(并且好像这个暴力大约500就会炸... 然后看了题解,才发 ...

  9. shell操作数组

    #!/bin/bash nums=( ) echo ${#nums[*]} #向数组中添加元素 nums[]="http://c.biancheng.net/shell/" ech ...

  10. Python文件操作,异常语法

    1.文件 2.异常 1.文件的输入输出 #1.打开文件 open 函数open(file,[option])#file 是要打开的文件#option是可选择的参数,常见有 mode 等​#2.文件的打 ...