码迷,mamicode.com
首页 > 其他好文 > 详细

[poj2342]Anniversary party_树形dp

时间:2018-03-08 13:53:13      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:ring   print   body   题目   sof   blog   树形dp   遍历   [1]   

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的路还有很长... ...

[poj2342]Anniversary party_树形dp

标签:ring   print   body   题目   sof   blog   树形dp   遍历   [1]   

原文地址:https://www.cnblogs.com/ShuraK/p/8527412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!