HDU 1520 Anniversary party 树上最大权独立集
2015-02-15 15:46
288 查看
题意:给出一颗树,树上每个点都有一个权值,求出最大权独立集。
思路:和前面的和一样,我们首先将无根树转化成有根树。
设dp[u][0]为不选择节点u,以u为根的子树的最大权独立集。dp[u][1]为选择节点u,得到的以u为根的子树的最大独立集。
因为对于节点u,我们有可以选也可以不选。
所以:
1.选择节点u后,u的所有儿子是不能选的,则:
dp[u][1]=value[u]+∑ v∈son(u) dp[v][0] dp[u][1] = value[u] +\sum_{v \in son(u)} dp[v][0]
2.不选择节点u,则u的所有儿子可以选择也可以不选择,
dp[u][0]=∑ v∈son(u) max(dp[v][0],dp[v][1]) dp[u][0]=\sum_{v \in son(u)} max(dp[v][0],dp[v][1])
边界条件:
dp[u][1]=value[u],dp[u][0]=0 dp[u][1] = value[u],dp[u][0] = 0
最终答案是dp[1][1],dp[1][0]中的最大值。
代码如下:
思路:和前面的和一样,我们首先将无根树转化成有根树。
设dp[u][0]为不选择节点u,以u为根的子树的最大权独立集。dp[u][1]为选择节点u,得到的以u为根的子树的最大独立集。
因为对于节点u,我们有可以选也可以不选。
所以:
1.选择节点u后,u的所有儿子是不能选的,则:
dp[u][1]=value[u]+∑ v∈son(u) dp[v][0] dp[u][1] = value[u] +\sum_{v \in son(u)} dp[v][0]
2.不选择节点u,则u的所有儿子可以选择也可以不选择,
dp[u][0]=∑ v∈son(u) max(dp[v][0],dp[v][1]) dp[u][0]=\sum_{v \in son(u)} max(dp[v][0],dp[v][1])
边界条件:
dp[u][1]=value[u],dp[u][0]=0 dp[u][1] = value[u],dp[u][0] = 0
最终答案是dp[1][1],dp[1][0]中的最大值。
代码如下:
#include <iostream> #include <cstring> #include <map> #include <string> #include <algorithm> using namespace std; const int MAX = 6010; int N; int to[MAX<<1],nxt[MAX<<1],head[MAX],tot; int a[MAX],dp[MAX][2]; void init() { memset(head,-1,sizeof(head)); tot = 0; } void addedge(int u, int v) { to[tot] = v; nxt[tot] = head[u]; head[u] = tot++; } void dfs(int u, int p) { dp[u][1] = a[u],dp[u][0] = 0; for(int i = head[u]; ~i; i = nxt[i]){ int v = to[i]; if(v == p) continue; dfs(v,u); dp[u][1] += dp[v][0]; dp[u][0] += max(dp[v][0],dp[v][1]); } } int main(void) { //freopen("input.txt","r",stdin); while(scanf("%d",&N) != EOF){ init(); int u,v; for(int i = 1; i <= N; ++i) scanf("%d",&a[i]); for(int i = 0; i < N - 1; ++i){ scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } scanf("%d%d",&u,&v); dfs(1,0); printf("%d\n",max(dp[1][1],dp[1][0])); } return 0; }
相关文章推荐
- HDU 1520 Anniversary party(树形DP-最大独立集)
- hdu 1520 Anniversary party(我的第一道树形DP)
- hdu(1520) Anniversary party(树形dp)
- HDU 1520 Anniversary party(简单树形DP)
- HDU 1520 Anniversary party -- 树形dp 好题目
- hdu 1520 Anniversary party
- HDU 1520 Anniversary party 简单树状DP
- HDU 1520 Anniversary party (树形DP)
- hdu 1520 Anniversary party(基本的树形DP)
- HDU 1520 Anniversary party 树形DP入门题
- 背包(4)Hdu 1520 Anniversary party(树形背包)+ Poj 1463 Strategic game(还可以贪心来做)
- [HDU] 1520 Anniversary party 入门树形DP
- HDU 1520 Anniversary party (树形DP)
- HDU 1520 Anniversary party【树形DP】
- HDU 1520 Anniversary party-----树形DP
- HDU 1520 Anniversary party (树状dp)
- hdu 1520 Anniversary party(树dp)
- HDU 1520 Anniversary party(树形DP)
- HDU - 1520 - Anniversary party
- hdu 1520 Anniversary party(基本树形DP)