zoukankan      html  css  js  c++  java
  • 树形DP

    在学习树形动归之前,请先储备类似01背包,完全背包的知识;

    顾名思义,树形动归就是在树上的动归,树形动归一般是依赖于dfs的,为什么呢,根据动归的后效性,父节点的状态一般都依赖子节点的状态以某种方式转移而来,而每一个父节点的孩子的数量不定,这就很难以寻常的递推式通过几个for解决掉,而大家可以想一下树这种东西它的遍历本身就依赖于dfs,可以说是比较暴力的打法了。

    题目链接:https://www.luogu.org/problemnew/show/P1352

    这是一道比较基础和经典的树形动归题;

    那我们现在来分析一下这道题,因为一个人不可能是他某个上司的上司,所以不可能出现环;如果一个人的上司被邀请,那么他的子节点就不会被邀请,这样的话,就会出现

    1.a(去)->b(不去)->c(去)

    2.a(去)->b(不去)->c(不去)

    这样我们就不能确定在b一定不去的情况下,是让c去而c的子节点不去而c的孙节点可以去快乐值大,还是c不去而c的子节点可以去快乐值大。这就是一个经典的......动归。

    这里因为我们需要判断一个点的子节点是去了还是没去,所以可以加一维,以0为去了,1为没去。

    那我们从哪个点开始呢,实际上从哪个点都可以,因为一个点的状态会以往上(父节点)和往下(子节点)的方式递归式传染,哪个点在上面哪个点在下面不重要。

    但是,不管怎样,整张图必须要始终保持一个有序性,(即有向图),所以我们不如用它顺理成章的祖宗(没有父节点的点);

    具体的代码里也有写。

    #include <iostream>
    #include <cstdio>
    #include <vector>
    using namespace std;
    
    vector<int> son[60004];
    int f[60001][3],val[60002],n;//因为之前开数组总是出锅,习惯性开大 
    bool have[60068]; 
    
    void dfs(int nx){
    	f[nx][0]=0;
    	f[nx][1]=val[nx];
    	for(int i=0;i<son[nx].size();i++){//这里我一开始时i是从1到son[nx].size(),实际上vector默认下标从0开始的; 
    		int ny=son[nx][i];
    		dfs(ny);
    		f[nx][0]+=max(f[ny][0],f[ny][1]);//脑子抽了一开始直接写得等于,因为父节点有好几个孩子所以得写+= 
    		f[nx][1]+=f[ny][0];
    	}
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		scanf("%d",&val[i]);
    	for(int i=1;i<=n;i++){
    		int a,b;
    		scanf("%d%d",&a,&b);
    		have[a]=1; //have用来存父亲 
    		son[b].push_back(a); //以邻接表的方式存图 
    	}	
    	for(int i=1;i<=n;i++){
    		if(have[i]==0){
    			int root=i;
    			dfs(root);
    			int ans=max(f[root][1],f[root][0]);
    			printf("%d",ans);
    			return 0;
    		}
    	}
    	return 0;
    }
    

     码字不易,多多包涵!

  • 相关阅读:
    python-web自动化环境安装
    python-单元测试优化,加入日志
    小谢第17问:三目运算符嵌套使用方法
    小谢第16问:1到6000的正整数正则表达式怎么写?
    小谢第15问:5到60的正整数正则表达式怎么写?
    小谢第14问:多个if语句和else if有什么区别?
    小谢第13问:输入框绑定回车enter事件自动刷新页面
    小谢第12问:初始化页面的时候子组件为什么不渲染?
    小谢第11问:vue中,子组件获取的值怎么传给父组件
    小谢第10问:前端JS下载文件、表格
  • 原文地址:https://www.cnblogs.com/jindui/p/10770393.html
Copyright © 2011-2022 走看看