hdu 1011 树形dp+背包

题意:有n个房间结构可看成一棵树,有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间有一定的敌人,每个士兵可以对抗20个敌人,士兵在某个房间对抗敌人使无法走开,同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少

分析:树形dp,对于点u,dp[u][j]表示以u为根的树消耗j个士兵得到的最大值,dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son][k]+val[u])

注意是无向图,vis位置不能随便放,且注意dp不能直接+val,因为这样根节点就加不到val了

虽然方程很快就想出来了,真写起来wa点还是很多的

第二次做

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=601;
16 int n,m,tt;
17 int aa[MAXN];
18 int tot,head[MAXN],dp[MAXN][MAXN],in[MAXN];
19 int bug[MAXN],val[MAXN],vis[MAXN];
20 struct Edge
21 {
22     int to,next;
23 }edge[MAXN<<2];
24 void addedge(int u,int v)
25 {
26     edge[tot].to=v;
27     edge[tot].next=head[u];
28     head[u]=tot++;
29 }
30 void dfs(int u)
31 {
32     vis[u]=1;
33     int num=(bug[u]+19)/20;
34     for(int i=num;i<=m;i++) dp[u][i]=val[u];
35     for(int i=head[u];i!=-1;i=edge[i].next)
36     {
37         int v=edge[i].to;
38         if(vis[v])  continue;
39         dfs(v);
40         for(int j=m;j>=num;j--)
41         {
42             for(int k=1;j-k>=num;k++)    //派k人攻打其他地方
43             {
44                 dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
45             }
46         }
47     }
48 }
49 void init()
50 {
51     tot=0;
52     memset(head,-1,sizeof(head));
53     cl(dp);
54     cl(vis);
55 }
56 int main()
57 {
58     int i,j,k;
59     #ifndef ONLINE_JUDGE
60     freopen("1.in","r",stdin);
61     #endif
62     while(scanf("%d%d",&n,&m)!=EOF)
63     {
64         if(n==-1&&m==-1)  break;
65         init();
66         for(i=1;i<=n;i++)
67         {
68             scanf("%d%d",&bug[i],&val[i]);
69         }
70         int u,v;
71         for(i=1;i<=n-1;i++)
72         {
73             scanf("%d%d",&u,&v);
74             addedge(u,v);
75             addedge(v,u);
76         }
77         if(m==0)
78         {
79             printf("0\n");
80             continue;
81         }
82         dfs(1);
83         printf("%d\n",dp[1][m]);
84     }
85 }
时间: 2024-12-13 14:34:47

hdu 1011 树形dp+背包的相关文章

HDU 1011 (树形DP+背包)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1011 题目大意:树上取点,先取父亲,再取儿子.每个点,权为w,花费为cost,给定m消费总额,求最大权和. 解题思路: 树形背包模板题.首先建一个无向图. 每个点的cost=(bug[root]+19)/20,即虫子数不满20也要派一个人. 用dp[i][j]表示以i为根的子树中,花费为j的最大权和. 转移方程:dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]),

HDU 1561 (树形DP+背包)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有个虚根0,取这个虚根也要cost,所以最后的结果是dp[0][m+1]. 本题是cost=1的特殊背包问题,在两个for循环上有一个优化. for(f+1...j....cost) for(1....k...j-cost) 其中f为当前已经dfs子结点个数.之所以+1,是因为根要预留一个空间. f+

HDU 4003 (树形DP+背包)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来,开销2倍.也可以不回来,一直停在某个点(如果你的机器人数量足够多的话).问最小开销. 解题思路: 其实这题只能说是类树形背包. 用dp[i][j]表示在i点,有j个不回来的机器人走过的最小开销. 比如dp[i][0]就表示,i点及其子点全部靠其它点的不回来的机器人探索.所以机器人是一来一回开销2倍

hdu 1011 树形dp

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16467    Accepted Submission(s): 4396 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of t

Starship Troopers(HDU 1011 树形DP)

题意: 给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子节点才有被占领的可能. DP状态转移方程: dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]); 看的王大神的代码,DFS写的,先从叶子节点开始向上遍历进行动态规划,自己看了dp方程也没写出来.. 1 #include <iostream> 2 #include

hdu1011 树形dp背包

http://acm.hdu.edu.cn/showproblem.php?pid=1011 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built underground. It is actually a huge cavern, which consists of many rooms connected with

HDU 1011 Starship Troopers(树形dp+背包)

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13109    Accepted Submission(s): 3562 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of

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

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6000    Accepted Submission(s): 3548 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻

hdu 5148 树形dp+分组背包问题

http://acm.hdu.edu.cn/showproblem.php?pid=5148 Problem Description Long long ago,there is a knight called JayYe.He lives in a small country.This country is made up of n cities connected by n-1 roads(that means it's a tree).The king wants to reward Ja