sgu 195 New Year Bonus Grant 树形dp

原创 2013年12月02日 19:22:25

       给一棵树,根节点为1,对于根节点以外的每一个节点,可以点亮该节点或他的一个儿子节点。求最多点亮的节点数*1000,以及一种可行的点亮方案。

       记dp[i][0]为i不点时,i的子树中点亮的节点数,dp[i][1]为i点亮时,i的子树中点亮的节点数。初始状态除了1意外所有的dp[i][1]都是1,然后从根节点开始dfs,dp[i][1]=dp[i][1]+sum(dp[v][0],g[i][v]==true),记res=sum(dp[v][0],g[i][v]==true),dp[i][0]=max(res-dp[v][0]+dp[v][1],g[i][v])。方案的话另开一个bool数组,更新Dp[i][0]的时候记录一下他的子节点的1,0情况就可以。

     

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
int n,m;
const int maxn=500000+500;
int dp[maxn][2];
bool ok[maxn];
vector<int> g[maxn];
void dfs(int i)
{
    int res=0;
    for (int j=0; j<g[i].size(); j++)
    {
        int v=g[i][j];
        dfs(v);
        res+=dp[v][0];
    }
    dp[i][1]+=res;
    int ans=res;
    int k=-1;
    for (int j=0; j<g[i].size(); j++)
    {
        int v=g[i][j];
        if (ans<res-dp[v][0]+dp[v][1])
        {
            k=v;
            ans=res-dp[v][0]+dp[v][1];
        }
    }
    dp[i][0]=ans;
    if (k!=-1) ok[k]=true;
}
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);
    memset(dp,0,sizeof dp);
    for (int i=1; i<=n; i++)
    dp[i][1]=1,g[i].clear();

    for (int i=2; i<=n; i++)
    {
        scanf("%d",&m);
        g[m].push_back(i);
    }
    memset(ok,0,sizeof ok);
    dfs(1);

    cout<<dp[1][0]*1000<<endl;
    for (int i=1; i<=n; i++)
    if (ok[i]) cout<<i<<" ";
    cout<<endl;
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016年08月27日 14:12
  • 1341

树形DP总结,持续更新

树形DP总结,持续更新
  • Dacc123
  • Dacc123
  • 2016年01月03日 18:09
  • 364

动态规划-树形dp总结

一.简单的从下到上和从上到下的统计 1.      dp[u]表示以u为根的一共有多少个节点.可以用来求重心. 2.      每个点出发能够走得最远的长度.dpm[u], dps[u]用来保存u...
  • u013625492
  • u013625492
  • 2015年06月17日 17:02
  • 1333

【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】

树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树、三叉树、静态搜索树、AV...
  • liuqiyao_01
  • liuqiyao_01
  • 2013年01月07日 16:47
  • 14991

test 宝藏(树形dp)

题解 :树形dp f[i]表示从i出发只能向下走最终回到i的最大值,f1[i]表示从i出发只能向下走 #include #include #include #include #include #def...
  • clover_hxy
  • clover_hxy
  • 2016年11月15日 08:23
  • 133

51nod 1737 配对 【树形dp】

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737题意:给出一棵n个点的树,将这n个点两两配对,求所有可行的方案...
  • hjt_fathomless
  • hjt_fathomless
  • 2017年02月20日 16:31
  • 205

51nod 苹果曼和树 (树形dp)

汉语题: 苹果曼有一棵n个点的树。有一些(至少一个)结点被标记为黑色,有一些结点被标 记为白色。 现在考虑一个包含k(0 ≤ k < n)条树边的集合。如果苹果曼删除这些边,那么会将这...
  • Since_natural_ran
  • Since_natural_ran
  • 2017年04月23日 15:37
  • 298

树形动态规划(树状DP)小结

树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索...
  • txl16211
  • txl16211
  • 2015年04月29日 23:10
  • 9232

poj 1848 Tree(树形DP,太难了,三种状态,四种状态转换)

1、http://poj.org/problem?id=1848 2、题目大意: 给出一棵树,现在要往这棵树上加边,使得所有的点都在环中,且每个点只能属于一个环 分析:参考http://hi.b...
  • sdjzping
  • sdjzping
  • 2014年01月21日 17:28
  • 1224

【NOIP 模拟题】[T2]宝藏(树形dp)

饮月千尺,寂夜成相思
  • reverie_mjp
  • reverie_mjp
  • 2016年11月14日 20:45
  • 257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sgu 195 New Year Bonus Grant 树形dp
举报原因:
原因补充:

(最多只允许输入30个字)