• 【树形DP】D. Serval and Rooted Tree


    【树形DP】D. Serval and Rooted Tree

    image

    题意:

    设叶子结点个数为n,则这些叶子节点有1到n的编号。

    且非叶子节点具有一个特殊的功能,就是获取其所有叶子结点中最大的编号或者最小的编号。(看具体赋予什么样的功能,取最大还是最小)

    求怎么赋予叶子结点的编号能够使得根节点能达到根节点功能的最优化。

    (有点贪心的感觉)用一个dp数组,其中dp[i]表示的编号为i的结点保存的第k大数。

    如果是取min的话,就统计儿子结点所附带的个数。

    如果是取max的话,就在儿子结点中挑一个最小的dp[son[u]]。

    #include <bits/stdc++.h>
    #define MEM(a,x) memset(a,x,sizeof(a))
    #define W(a) while(a)
    #define gcd(a,b) __gcd(a,b)
    #define pi acos(-1.0)
    #define PII pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define ull unsigned long long
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define MAX 1000005
    #define MOD 1000000007
    #define INF 0x3f3f3f3f
    #define lowbit(x) (x&-x)
    using namespace std;
    inline int read()
    {
        int x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0' && ch<='9')
            x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    const int N = 3E5+100;
    int h[N],ne[N],e[N],idx;
    void add(int a,int b)
    {
    	e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    } 
    int dp[N];
    int n,m,opt[N],leaves;
    int dfs(int u)
    {	
        int ans_max = 3e5+100,ans_min = 0; 
    	if(h[u]==-1)
    	{
    		leaves++;
    		return dp[u]=1;
        }
    	else
    	{
    		for(int i=h[u];~i;i=ne[i])
    		{
    			int v = e[i];	
    			if(opt[u])
    				ans_max = min(ans_max,dfs(v));
    			else
    				ans_min += dfs(v);
    		}
    	}
    	if(opt[u])
    	   return dp[u] = ans_max;
    	return dp[u] = ans_min;
    }
    
    int main()
    {
    	memset(h,-1,sizeof(h));
        int n = read();
    	for(int i=1;i<=n;i++)
    	   opt[i] = read();
    	for(int i=2;i<=n;i++)
    	{
    	    int fa = read();
    		add(fa,i);	
        } 	
        dfs(1);
        cout<<leaves-dp[1]+1;
        return 0;
    }
    
    
  • 相关阅读:
    8.Http的状态码有哪些
    6、<!DOCTYPE>声明是什么意思
    6.px和em的区别
    5、什么叫优雅降级和渐进增强
    3、简述src和href的区别;@import和link的区别
    2、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?
    1、盒模型理解
    requests学习(一)——get请求
    【Flutter】功能型组件之跨组件状态共享
    【Flutter】功能型组件之数据共享
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15546155.html
Copyright © 2020-2023  润新知