POJ 2342 Anniversary party 树形DP

来源:互联网 发布:日本 9月进出口数据 编辑:程序博客网 时间:2024/06/13 18:17

题目链接:http://poj.org/problem?id=2342

入门题:
dp[rt][0] = sum{dp[ch][0] + dp[ch][1]}
dp[rt][1] = sum{dp[ch][0]}
代码:

#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf printfusing namespace std;const int maxn = 6000 + 5;int dp[maxn][2],value[maxn];struct Edge{    int v,pre;}e[maxn << 1];int head[maxn];int tot;void init_edge(){    memset(head,-1,sizeof(head));    tot = 0;}void addEdge(int u,int v){    e[tot].v = v;    e[tot].pre = head[u];    head[u] = tot++;}int DPS(int rt,int st){    if(~dp[rt][st]) return dp[rt][st];    int& ans = dp[rt][st];    ans = 0;    if(st){        ans = value[rt];        for(int i = head[rt];~i;i = e[i].pre){            ans += DPS(e[i].v,0);        }    }    else{        for(int i = head[rt];~i;i = e[i].pre){            ans += max(DPS(e[i].v,0),DPS(e[i].v,1));        }    }    return ans;}void init(){    memset(dp,-1,sizeof(dp));}int ins[maxn];int main(){    int n,u,v;    while( sf("%d",&n) ){        if(!n){            sf("%d",&n);            break;        }        for(int i = 1;i <= n;++i) sf("%d",&value[i]);        init_edge();        init();        for(int i = 1;i < n;++i){            sf("%d %d",&v,&u);            addEdge(u,v);            ins[v]++;        }        for(int i = 1;i <= n;++i){            if(!ins[i]){                pf("%d\n",max(DPS(i,0),DPS(i,1)));                break;            }        }    }}
0 0
原创粉丝点击