HDU 1520 Anniversary party (树形DP)

来源:互联网 发布:php电影播放器源码 编辑:程序博客网 时间:2024/06/05 15:33

树形DP的关键在于如何处理递归返回的信息。这题dp[i][0]表示不选i点时当前最高权值。dp[i][1]表示选i点时当前最高权值。状态转移方程:dp[u][[0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0];

代码如下:

#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace std;#define LL __int64#define pi acos(-1.0)const int mod=100000000;const int INF=0x3f3f3f3f;const double eqs=1e-8;int dp[7000][2], c[7000], vis[7000];int head[7000], cnt, n;struct node{    int u, v, next;}edge[100000];void add(int u, int v){    edge[cnt].v=v;    edge[cnt].next=head[u];    head[u]=cnt++;}void dfs(int u){    vis[u]=1;    dp[u][1]=c[u];    for(int i=head[u];i+1;i=edge[i].next){        int v=edge[i].v;        if(!vis[v]){            dfs(v);            dp[u][0]+=max(dp[v][0],dp[v][1]);            dp[u][1]+=dp[v][0];        }    }}void init(){    memset(vis,0,sizeof(vis));    memset(head,-1,sizeof(head));    cnt=0;    memset(dp,0,sizeof(dp));}int main(){    int i, j, u, v;    while(scanf("%d",&n)!=EOF){        for(i=1;i<=n;i++){            scanf("%d",&c[i]);        }        init();        while(scanf("%d%d",&u,&v)!=EOF&&u&&v){            add(u,v);            add(v,u);        }        dfs(1);        printf("%d\n",max(dp[1][0],dp[1][1]));    }    return 0;}


1 0
原创粉丝点击