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

HDU 4340 树形DP

时间:2014-10-16 23:01:43      阅读:220      评论:0      收藏:0      [点我收藏+]

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

【题意】:

给你一张无向图,无向图上每个点代表一个城市,有两个值Va,Vb,分别代表a,b占领该城市所需要消耗的时间,而且a或b去占领它们已经占领的城市的相领城市所需的花费为标准的一般。问最少需要花费多少钱。

【知识点】:

树形DP

【题解】:
dp[u][i][0]:代表以u为根的子树中没有一个点为颜色i绘画开始点所需的最小花费,
即字数中画有i颜色的点的代价都为原来的一般
dp[u][i][1]:代表以u为根的子树中有一个点为颜色i绘画开始点所需的最小花费
u的子树中涂i色的点中有一个点为其本身的代价而不是其一半

【代码】:

bubuko.com,布布扣
 1 #include <map>
 2 #include <set>
 3 #include <cmath>
 4 #include <ctime>
 5 #include <queue>
 6 #include <stack>
 7 #include <cstdio>
 8 #include <string>
 9 #include <vector>
10 #include <cstring>
11 #include <sstream>
12 #include <iostream>
13 #include <algorithm>
14 #include <bitset>
15 #include <climits>
16 using namespace std;
17 
18 #define wh while
19 #define inf (int)(~0u/2)
20 #define FOR(i, n) for(int i = 0; i < n; i++)
21 #define FOR1(i, n) for(int i = 1; i < n; i++)
22 #define FOR2(i, n) for(int i = 0; i <= n; i++)
23 #define REP(i,n) for(int i = 1; i <= n; i++)
24 #define FORI(it,n) for(typeof(n.begin()) it = n.begin(); it != n.end(); it++)
25 #define sf scanf
26 #define pf printf
27 #define frs first
28 #define sec second
29 #define psh push_back
30 #define mkp make_pair
31 #define PB(x) push_back(x)
32 #define MP(x, y) make_pair(x, y)
33 #define clr(abc,z) memset(abc,z,sizeof(abc))
34 #define lt(v) v << 1
35 #define rt(v) v << 1 | 1
36 //#define mid ((l + r) >> 1)
37 #define lson l, mid, v << 1
38 #define rson mid + 1, r, v << 1 | 1
39 
40 #define fre freopen("1.txt", "r", stdin)
41 
42 typedef long long LL;
43 typedef long double LD;
44 const int INF = 0x3F3F3F3F;
45 const int maxn = 120;
46 vector<int> G[maxn];
47 int dp[maxn][2][2];
48 int cost[maxn][2]; int N;
49 
50 void dfs(int u, int fa){
51     if(G[u].size() == 1 && fa != 0){
52         FOR(i, 2){
53             dp[u][i][0] = cost[u][i] / 2;
54             dp[u][i][1] = cost[u][i];
55         }
56         return ;
57     }
58     FOR(i, (int)G[u].size()){
59         int v = G[u][i];
60         if(v == fa) continue;
61         dfs(v, u);
62     }
63     FOR(i, 2){
64         int sum = 0, cha = INF;
65         int cst = cost[u][i];
66         FOR(j, (int)G[u].size()){
67             int v = G[u][j];
68             if(v == fa) continue;
69             int tmp = min(dp[v][i][0], dp[v][i ^ 1][1]); sum += tmp;
70             cha = min(cha, dp[v][i][1] - tmp);
71             //将原先选中的dp[v][i][0]或dp[v][i ^ 1][1]替换成dp[v][i][1]所需要的最小代价
72         }
73         dp[u][i][0] = cst / 2 + sum;
74         dp[u][i][1] = min(cst + sum, cst / 2 + sum + cha);
75     }
76 }
77 
78 int main() {
79     wh(sf("%d", &N) != EOF){
80         REP(i, N) G[i].clear();
81         REP(i, N) sf("%d", &cost[i][0]);
82         REP(i, N) sf("%d", &cost[i][1]);
83         REP(i, N - 1){
84             int u, v; sf("%d%d", &u, &v);
85             G[u].PB(v); G[v].PB(u);
86         }
87         dfs(1, 0);
88         pf("%d\n", min(dp[1][0][1], dp[1][1][1]));
89     }
90 }
View Code

 

HDU 4340 树形DP

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

原文地址:http://www.cnblogs.com/Ntcrush/p/4029632.html

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