POJ2342_Anniversary party 树形DP

来源:互联网 发布:英语句子语法分析软件 编辑:程序博客网 时间:2024/05/16 10:42

 题意: 给定一个n, 对于每个人有一个权重,然后给定一个上下级关系,上级来了直属下级不能取,最后问最大权重值。


做法: 树形DP,先确定根节点,然后在通过转移方程

   dp[root][1]+=dp[son][0];
    dp[root][0]+=max(dp[son][0],dp[son][1]); 确定


AC 代码:

#include<iostream>#include<vector>#include<cstring>using namespace std;int p[6001];int dp[6001][2];vector<int>edge[6011];int num[6011];int father[6011];int work(int root){    dp[root][0]=0;dp[root][1]=p[root];    for(int i=0;i<num[root];i++)    {        int temp=edge[root][i];        //cout<<temp<<endl;        work(temp);        dp[root][1]+=dp[temp][0];        dp[root][0]+=max(dp[temp][0],dp[temp][1]);    }    return max(dp[root][0],dp[root][1]);}int main(){    int n;    cin>>n;    memset(p,0,sizeof(p));    memset(dp,0,sizeof(dp));    memset(num,0,sizeof(num));    memset(father,0,sizeof(father));    for(int i=1;i<=n;i++)    cin>>p[i];    int a,b;    while(cin>>a>>b)    {        if(a==0&&b==0)break;        else        {            edge[b].push_back(a);            father[a]=1;            num[b]++;        }    }    int root;    for(int i=1;i<=n;i++){if(father[i]==0) root=i;} //   cout<<"root is "<<root<<endl;    int Max=work(root);    cout<<Max<<endl;}


原创粉丝点击