首页 > 代码库 > HDU 4340 树形DP

HDU 4340 树形DP

【题意】:

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

【知识点】:

树形DP

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

【代码】:

 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 while19 #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 scanf26 #define pf printf27 #define frs first28 #define sec second29 #define psh push_back30 #define mkp make_pair31 #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 << 135 #define rt(v) v << 1 | 136 //#define mid ((l + r) >> 1)37 #define lson l, mid, v << 138 #define rson mid + 1, r, v << 1 | 139 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