[Hdu 1520] (DP_树形DP) 入门训练
来源:互联网 发布:曹变蛟 知乎 编辑:程序博客网 时间:2024/04/29 10:16
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520
题目大意:给定一棵关系树,每个节点有个权值,子节点和父节点不能同时选,问最后能选的最大价值是多少?
解题思路:树形DP入门题。由于子节点与父节点不能同时选,有人可能会用贪心思想,二者选其一肯定最优。其实不然,有可能父节点和子节点都不选,而要选子孙节点。不过只要再往深点想下,就可以得出动态规划的解法。每个节点要么选要么不选,和大多数选不选动归一样,来个dp[i][2],0表示不选,1表示不选,那我们只要从叶子节点往根结点不断更新dp[i][0]和dp[i][1]就可以了。
状态转移方程:dp[i[[1] = sum(dp[j][0]) + 当前节点 (当前选了,子节点必定不能选,最优的情况是都不选,然后累加)
dp[i][0] = sum(max(dp[i][0],dp[i][1])) (当选不选,子节点可选可不选,找大的那个状态)
测试数据:
1
1
0 0
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
#include <stdio.h>#include <string.h>#define MAX 20000#define max(a,b) (a)>(b)?(a):(b)struct node { int v; node *next;}*head[MAX],tree[MAX];int n,ptr,dp[MAX][2];int vis[MAX],num[MAX];void Initial() { ptr = 1; memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(head,NULL,sizeof(head));}void AddEdge(int x,int y) { tree[ptr].v = y; tree[ptr].next = head[x],head[x] = &tree[ptr++]; tree[ptr].v = x; tree[ptr].next = head[y],head[y] = &tree[ptr++];}void Tree_DP(int v) { if (vis[v]) return; vis[v] = 1; int i,j,k,tot = 0,sum; node *p = head[v]; while (p != NULL) { if (!vis[p->v]) { Tree_DP(p->v); dp[v][1] += dp[p->v][0]; dp[v][0] += max(dp[p->v][1],dp[p->v][0]); } p = p->next; } dp[v][1] += num[v];}int main(){ int i,j,k,a,b; while (scanf("%d",&n) != EOF) { Initial(); for (i = 1; i <= n; ++i) scanf("%d",&num[i]); while (scanf("%d%d",&a,&b),a+b) AddEdge(a,b); Tree_DP(1); printf("%d\n",max(dp[1][0],dp[1][1])); } return 0;}
0 0
- [Hdu 1520] (DP_树形DP) 入门训练
- 【DP_树形DP专辑】
- 【DP_树形DP专辑】
- 【DP_树形DP专辑】
- hdu 1520 树形dp入门
- HDU 1520【树形dp入门】
- 【DP_树形DP专辑小结】
- HDU 1520 Anniversary party(树形DP入门)
- hdu 1520 树形dp入门题
- HDU 1520Anniversary party 树形DP入门
- 树形dp入门 hdu 1520 and 2196
- HDU 1520 Anniversary party 树形DP入门
- hdu 1520 Anniversary party 树形dp入门
- HDU 1520 Anniversary party 树形dp 入门
- Poj 2152 Fire (DP_树形DP)
- 【DP_树形DP专题】题单总结
- 【树形DP】hdu 1520
- hdu 1520-树形DP
- 堆的push,pop数组实现(挑战程序设计竞赛)
- iOS项目的完整重命名方法图文教程
- 我是如何向老婆解释MapReduce的?
- POJ1014Dividing【多重背包+二进制优化】
- Android 平台下使用 i2c-tools
- [Hdu 1520] (DP_树形DP) 入门训练
- nim manual(二)
- 嵌入式系统(Linux&Android)学习路线
- OA开发很简单,OA实施很复杂!
- for_each可能导致的数据丢失
- ORACLE AUDIT
- ASP.NET Web API的版本化与安全性
- PHP数组合并+与array_merge的区别分析
- 在CSDN的博文中插图片的方法