2012 Multi-University Training Contest 5-1001 hdu4340
2012-08-07 18:50
344 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4340
树形dp
我们可以知道,如果某一个连通的点集染的是同一种颜色,则这个集合中只要而且必须有一个点取完整的费用,其他的点都只需要对应费用的一半。
状态:
dp[i][j][k] (0 <= i <= n, 0<=j<=1, 0 <= k <= 1) 表示以i为根的子树的费用,其中i节点被染成了第k种颜色,且子树中与i染成同一种颜色的与i连通的点集有j个点选取了完整的费用(j只需为0或1)。
若root为根节点,则最后需要的结果为: min(dp[root][1][0], dp[root][1][1]}。
状态转移方程:
v为i节点的儿子节点。令 S = sum{min(dp[v][0][j], dp[v][1][1-j])}, det = min{dp[v][1][j] - min(dp[v][0][j], dp[v][1][1-j])};
dp[i][0][j] = cost[i][j]/2 + S;
dp[i][1][j] = min(cost[i][j] + S, cost[i][j]/2 + S + det);
树形dp
我们可以知道,如果某一个连通的点集染的是同一种颜色,则这个集合中只要而且必须有一个点取完整的费用,其他的点都只需要对应费用的一半。
状态:
dp[i][j][k] (0 <= i <= n, 0<=j<=1, 0 <= k <= 1) 表示以i为根的子树的费用,其中i节点被染成了第k种颜色,且子树中与i染成同一种颜色的与i连通的点集有j个点选取了完整的费用(j只需为0或1)。
若root为根节点,则最后需要的结果为: min(dp[root][1][0], dp[root][1][1]}。
状态转移方程:
v为i节点的儿子节点。令 S = sum{min(dp[v][0][j], dp[v][1][1-j])}, det = min{dp[v][1][j] - min(dp[v][0][j], dp[v][1][1-j])};
dp[i][0][j] = cost[i][j]/2 + S;
dp[i][1][j] = min(cost[i][j] + S, cost[i][j]/2 + S + det);
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> #include <cmath> #include <string> #include <climits> #include <vector> using namespace std; #define N 103 #define INF INT_MAX //typedef long long LL; int root; int vis ; int dp [2][2],a [2]; vector<int> emp ; void dfs(int k) { int l=emp[k].size(); if (l==0) { dp[k][1][0]=a[k][0]; dp[k][1][1]=a[k][1]; dp[k][0][0]=(int)a[k][0]/2; dp[k][0][1]=(int)a[k][1]/2; return; } for (int i=0;i<l;i++) dfs(emp[k][i]); for (int j=0;j<2;j++) { int tmp=INF,sum=0; for (int i=0;i<l;i++) { int s=emp[k][i]; int ti=min(dp[s][0][j],dp[s][1][1-j]); tmp=min(tmp,dp[s][1][j]-ti); sum+=ti; } dp[k][0][j]=sum+a[k][j]/2; dp[k][1][j]=min(sum+a[k][j],sum+a[k][j]/2+tmp); } } int main() { int n,t1,t2; while (scanf("%d",&n)!=EOF) { for (int j=0;j<2;j++) for (int i=1;i<=n;i++) scanf("%d",&a[i][j]); memset(vis,0,sizeof(vis)); for (int i=0;i<N;i++) emp[i].clear(); for (int i=0;i<n-1;i++) { scanf("%d%d",&t1,&t2); if (i==0) root=t1; if (!vis[t2]) { emp[t1].push_back(t2); vis[t1]=1; } else emp[t2].push_back(t1); } memset(dp,0,sizeof(dp)); dfs(root); printf("%d\n",min(dp[root][1][0],dp[root][1][1])); } return 0; }
相关文章推荐
- 2012 Multi-University Training Contest 5-1001 hdu4340(Virus原创)
- 2012 Multi-University Training Contest 6-1001 hdu4350 Card
- 2012 Multi-University Training Contest 5[hdu4340~4349]
- 2012 Multi-University Training Contest 4-1001 hdu4331 Image Recognition
- 2012 Multi-University Training Contest 7-1001 hdu4360 As long as Binbin loves Sangsang
- 2017 Multi-University Training Contest 10 1001 Admiral HDU 6171 (双向搜索 哈希)
- 2012 Multi-University Training Contest 2
- 2012 Multi-University Training Contest 5
- 2012 Multi-University Training Contest 3:Triangle LOVE_判断有向图中是否含有仅由三个点组成的环
- 2012 Multi-University Training Contest 7:Palindrome graph
- 【2012 Multi-University Training Contest 7】部分题
- 2015 Multi-University Training Contest 1 - 1001 OO’s Sequence
- 2016 Multi-University Training Contest 2 1001 hdu 5734 暴力
- 贪心 ( HDU 5821 )——2016 Multi-University Training Contest 8 1001
- hdu 4336 Card Collector 2012 Multi-University Training Contest 4
- 2012 Multi-University Training Contest 2
- 2012 Multi-University Training Contest 2
- 2012 Multi-University Training Contest 3
- hdu4325-Flowers-2012 Multi-University Training Contest 3-题解
- hdu 4355 Party All the Time (2012 Multi-University Training Contest 6 ) 三分搜索