[poj2342]Anniversary party_树形dp

Anniversary party poj-2342

    题目大意:没有上司的舞会原题。

    注释:n<=6000,-127<=val<=128.

      想法:其实就是最大点独立集。我们介绍树形dp

        树形dp就是以节点或者及其子树为信息,进行动态规划。用dfs的原理,遍历,在回溯是更新父亲节点。

      然后,关于这道题,我们就可以对于每一个节点进行标记,然后对于满足条件的节点进行遍历。设状态就是两个dp,分别表示选当前根节点和不选当前根节点。更新是瞎jb更新即可... ....

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int father[6005],vis[6005],dp[6005][2],t;
void dfs(int node)
{
    vis[node] = 1;
    for(int i=1;i<=t;i++)
    {
       if(!vis[i]&&father[i]==node)
       {
           dfs(i);
           dp[node][1]+=dp[i][0];
           dp[node][0]+=max(dp[i][0],dp[i][1]);
       }
    }
}

int main()
{
    int l,k,root;
    while(~scanf("%d",&t))
    {
        for(int i=1;i<=t;i++)
        scanf("%d",&dp[i][1]);
        root=0;
        while(scanf("%d%d",&l,&k),l+k>0)
        {
            father[l]=k;
            root=k;
        }
        memset(vis,0,sizeof(vis));
        dfs(root);
        printf("%d\n",max(dp[root][1],dp[root][0]));
    }

    return 0;
}

     小结:对于树形dp的路还有很长... ...

posted @ 2018-03-08 11:31  JZYshuraK_彧  阅读(151)  评论(0编辑  收藏  举报