poj2342 简单树形DP

来源:互联网 发布:淘宝刷流量收藏软件 编辑:程序博客网 时间:2024/03/29 14:16

题意就不说了,只要学过英语的,肯定能看懂。

首先分析一下,发现是一颗树,那么我们另

f[i][0]表示以i为根,i不去能达到的最大快乐值;f[i][1]表示以i为根,i参加聚会能达到的最大快乐值。

那么:

f[i][0]=sigma( max( f[i的孩子节点][0],f[i的孩子节点][1] ) );

f[i][1]=sigma(f[i的孩子节点][0])+val[i];

程序实现的时候,我先初始化:f[i][1]=val[i],f[i][0]=0;

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define MAX 6111using namespace std;int root,n;int val[MAX],next[MAX],head[MAX],f[MAX][2];bool isson[MAX];void init(){    int i,j;    int L,K;    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%d",&val[i]);    }    for(i=1;i<n;i++)    {        scanf("%d%d",&L,&K);        next[L]=head[K];        head[K]=L;        isson[L]=true;    }    for(i=1;i<=n;i++)        if(!isson[i])          root=i;}void DP(int u){    if(!u) return ;    int v;    f[u][1]=val[u];    f[u][0]=0;    for(v=head[u];v;v=next[v])    {        DP(v);        f[u][0]+=max(f[v][0],f[v][1]);        f[u][1]+=f[v][0];    }}int main(){    int i,j;    init();    DP(root);    printf("%d\n",max(f[root][0],f[root][1]));    return 0;}


 

0 0
原创粉丝点击