ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

0阶段-第五~六日-树形dp

2021-07-08 18:33:56  阅读:99  来源: 互联网

标签:六日 递归 int 转移 树形 节点 dp


摸了,但完全没摸。
第五~六日,树形dp。

第五日:
1、3、6普通题
2、4、7 树形dp+分组背包
5、树形+区间
第六日:
1、2、3 树形dp+分组背包
4、5、6、7 换根dp
整理:
一、普通题
设个状态,然后就是记忆化搜一下,递归找一下。难度较易
二、树形dp+区间dp
既可以用迭代也可以递归,不过递归比较容易思考。
三、树形dp+分组背包
1、简单的说,给你n个物品,物品之间有着一对多的依赖关系,这样往往能把所有物品画成一棵树(不能就添加根节点把森林连成树),所谓的依赖关系就是孩子节点选择了父亲节点也要选择。题意挑选m件物品使得总价值最大。
2、定义状态dp[u][k][i].其出于中间过程中表示,在以u为根的子树中。从前k棵直接相连的子树中选节点能装入大小为i的空间的最大价值。当其求出来后,再添入u节点,此时的含义为在以u为根的子树中选节点...(省略)。
3、转移的过程就是空间i的分配过程。可得出:
• dp[u][k][i]=max{dp[u][k-1][i-t]+dp[v][N][t]} 中间过程
• dp[u][最大的k值][i]=dp[u][最大的k值][i-1]+ww[u],ww[u]为u节点的价值
4、然后滚动数组优化掉k这一维.
5、接着dfs即可

void dfs(int u){                                        		
    for(int k=0;k<g[u].size();++k){								
        int v=g[u][k];										
        dfs(v);												
        for(int i=m-1;i>=1;--i){								
            for(int t=0;t<=i;++t){								
                dp[u][i]=max(dp[u][i],dp[u][i-t]+dp[v][t]);		
             }												
        }													
    }														
    for(int i=m;i>=1;--i){										
        dp[u][i]=dp[u][i-1]+w[u];								
    }                            								
}	

6、还有一些复杂的优化,不过要考虑的细节比较多。
四、二次扫描换根dp
1、简单来说,考虑一颗树的换根时,状态怎么转移的问题。
2、 容易发现,从根作为父节点到孩子节点转移时,其实变化并不明显。设原树为T,转移后为T*,对比可以发现树形变化不大且有规律可循。只有部分参数要做出微调而大部分不变。
3、借助这一个特性可以定义状态然后推出转移方程。换根后又是一颗树,然后可以继续转移。

标签:六日,递归,int,转移,树形,节点,dp
来源: https://www.cnblogs.com/Flowyuan-Foreverworld/p/14987539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有