POJ-2342 Anniversary party(Tree dp)
2013-09-01 14:54
225 查看
最基础的Tree dp
dp[i][0]表示编号为i的结点不去,dp[i][1]表示编号为i的结点去。
转移方程为dp[i][0] += max(dp[son[i]][0],dp[son[i]][1]);
dp[i][1] += dp[son[i]][0];
dp[i][0]表示编号为i的结点不去,dp[i][1]表示编号为i的结点去。
转移方程为dp[i][0] += max(dp[son[i]][0],dp[son[i]][1]);
dp[i][1] += dp[son[i]][0];
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> const int MAXN = 6005; int n; int dp[MAXN][2],fa[MAXN]; bool vis[MAXN]; inline int max(int a,int b){ return a<b ? b : a; } void dfs(int root) { vis[root] = 1; for(int i = 1;i <= n;i++) { if(!vis[i]&&fa[i]==root) { dfs(i); dp[root][1] += dp[i][0]; dp[root][0] += max(dp[i][0],dp[i][1]); } } } int main() { while(scanf("%d",&n) != EOF) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); for(int i = 1;i <= n;i++) scanf("%d",&dp[i][1]); bool beg = 1; int root = 0,l,k; while(scanf("%d%d",&l,&k) == 2 && l+k>0){ fa[l] = k; if(root==l||beg) { root = k; beg = 0; } } dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); //Free(n); } }
相关文章推荐
- [ACM] POJ 2342 Anniversary party (树形DP入门题)
- poj 2342 Anniversary party (树形DP)
- poj 2342 Anniversary party(树形dp)
- poj 2342 Anniversary party 树形dp入门
- POJ2342 Anniversary party(动态规划)(树形DP)
- 树形DP-POJ-2342-Anniversary party
- poj 2342 Anniversary party(简单树形dp+dfs)
- POJ2342 Anniversary party(树形dp)
- poj 2342 Anniversary party(树形dp)
- poj 2342 Anniversary party(树形dp)
- POJ 2342 && HDU 1520 Anniversary party(树形DP)
- POJ 2342 Anniversary party (树形dp 入门题)
- poj 2342 / hdu 1520 Anniversary party(树形dp)
- POJ 2342 Anniversary party 树形DP
- poj2342--hdu1520-- Anniversary party(树形DP练习1)
- poj 2342 Anniversary party (树形dp)
- POJ 2342 Anniversary party(树形DP)
- POJ:2342-Anniversary party(树形dp入门题目)
- POJ 2342 Anniversary party (树形dp入门)
- poj 2342 Anniversary Party(树形dp)