码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU 1561] The more, The Better (树形dp)

时间:2014-11-03 00:00:13      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   for   sp   

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

题目大意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?

 

设计状态 dp[u][i] 代表以u为根的,选择i个的最大收获

状态转移 dp[u][j+k] = max( dp[u][j+k], dp[u][j]+dp[v][k] );

注意状态转移的写法

 

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cctype>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <iterator>
11 #include <functional>
12 #include <cmath>
13 #include <numeric>
14 using namespace std;
15 
16 typedef long long LL;
17 
18 const int MAX_N = 210;
19 struct EDGE{
20     int to,next;
21 };
22 EDGE edge[MAX_N];
23 int head[MAX_N],ptr;
24 
25 void init(){
26     memset(head,-1,sizeof(head));
27     memset(edge,-1,sizeof(edge));
28     ptr = 0;
29 }
30 
31 void add_edge(int from,int to){
32     edge[ptr].to = to;
33     edge[ptr].next = head[from];
34     head[from] = ptr++;
35 }
36 
37 int N,M;
38 int val[MAX_N],dp[MAX_N][MAX_N],sum[MAX_N];
39 bool vis[MAX_N];
40 
41 void dfs(int u){
42     if( vis[u] ) return;
43     vis[u] = true;
44     int tot = 0;
45     sum[u] = 1;
46 
47     for(int i=1;i<=M;i++){
48         dp[u][i] = val[u];
49     }
50 
51     for(int i=head[u];~i;i=edge[i].next){
52         int v = edge[i].to;
53         if( vis[v] ) continue;
54         tot++;
55         dfs(v);
56         sum[u] += sum[v];
57     }
58 
59     if( tot == 0 ){
60         return;
61     }
62 
63     for(int i=head[u];~i;i=edge[i].next){
64         int v = edge[i].to;
65 //        printf("v = %d\n",v);
66         int ub = 1;
67         if( u==0 ) ub = 0;
68         for(int j=M;j>=ub;j--){
69             for(int k=1;k<=sum[v];k++){
70                 if( j+k<=M ){
71                     dp[u][j+k] = max(dp[u][j+k],dp[u][j]+dp[v][k]);
72 //                    printf("dp[%d][%d] = dp[%d][%d]+dp[%d][%d]=%d\n",u,j+k,u,j,v,k,dp[u][j]+dp[v][k]);
73                 }
74             }
75         }
76     }
77 }
78 
79 int main(){
80     while( scanf("%d%d",&N,&M)!=EOF ){
81         if( N==0&&M==0 ) break;
82         init();
83         memset(val,0,sizeof(val));
84         for(int i=1;i<=N;i++){
85             int t;
86             scanf("%d%d",&t,&val[i]);
87             add_edge(t,i);
88         }
89         memset(dp,0,sizeof(dp));
90         memset(vis,0,sizeof(vis));
91         memset(sum,0,sizeof(sum));
92         dfs(0);
93         printf("%d\n",dp[0][M]);
94     }
95     return 0;
96 }

 

[HDU 1561] The more, The Better (树形dp)

标签:style   blog   http   io   color   ar   os   for   sp   

原文地址:http://www.cnblogs.com/llkpersonal/p/4070261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!