poj 2486 树形dp(给定步数 走一棵树,获得的节点值总和的最大值)
2017-04-28 20:31
337 查看
#include<cstdio> #include<cstring> #define MAX(x,y) ((x)>(y)?(x):(y)) struct node { int to,next; }e[2400]; int cnt,n,k,head[220],dp[220][220][2],v[220]; void add_edge(int from,int to) { e[cnt].to=to; e[cnt].next=head[from]; head[from]=cnt++; } void dfs(int u,int v) { for(int i=head[u];i!=-1;i=e[i].next) { int to=e[i].to; if(to==v) continue; dfs(to,u); for(int j=k;j>0;j--) for(int p=1;p<=j;p++) { dp[u][j][0]=MAX(dp[u][j][0],dp[u][j-p][1]+dp[to][p-1][0]); if(p>1) { dp[u][j][0]=MAX(dp[u][j][0],dp[u][j-p][0]+dp[to][p-2][1]); dp[u][j][1]=MAX(dp[u][j][1],dp[u][j-p][1]+dp[to][p-2][1]); } } } } int main() { while(~scanf("%d%d",&n,&k)) { for(int i=1;i<=n;i++) { scanf("%d",&v[i]); for(int j=0;j<=k;j++) dp[i][j][0]=dp[i][j][1]=v[i]; } cnt=0; memset(head,-1,sizeof(head)); for(int i=1;i<n;i++) { int a,b; scanf("%d%d",&a,&b); add_edge(a,b); add_edge(b,a); } dfs(1,-1); printf("%d\n",dp[1][k][0]); } }
相关文章推荐
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
- poj 2486(树形dp)
- POJ-2486 Apple Tree 树形DP
- POJ 2486 Apple Tree 树形DP
- poj 2486 Apple Tree(树形DP,状态好纠结。。。)
- POJ 2486 Apple Tree(树形DP + 01背包)
- poj 2486 apple tree 树形DP 不懂的一定把你讲懂
- POJ 2486 Apple Tree 树形DP
- poj 2486 Apple Tree (树形背包dp)
- poj-2486-树形dp
- POJ 2486 apple tree(树形dp)
- poj 2486 (树形dp (好题))
- POJ2486 - Apple Tree(树形DP)
- poj 2486 树形dp
- poj 2486 树形DP 子树合并
- poj 2486 树形DP
- POJ 2486 Apple Tree(树形DP)
- poj 2486 apple tree 树形DP 不懂的一定把你讲懂
- poj 2486(树形dp)
- poj 3342 树形dp_最大独立集合