树形dp空间优化(dfn)
树形dp空间优化
介绍
有时题目会告诉我们n叉树的最大层数,或者给出一个完全n叉树树,直接做树形dp会爆空间时,就可以用这个优化方法。
多数树形dp都是先dfs到子树,再合并到根上,显然当合并到根上时子树的信息没有意义了,这就浪费了空间。
举个例子:

一般的解法会用f[i(1~5)]
但在合并到2后,f[3] f[4]没用了,这时我们就可以用这些空间存5的信息。
实现
定义dfn,注意这里的dfn与dfs需有区别。
以下手动模拟dfs
当前点 dfn
1 1
2 2
3 3
4 4
5 3
每个点的dfn等于父亲的dfn+这是第几个儿子。
5是1的第二个儿子 1+2=3。
此时存i号点信息的就是f[dfn[i]]
f数组一般只要开到(n(最大层数)*m(m叉树))相比起开到总点数小了不少。
例题
#include<bits/stdc++.h>
using namespace std;
const int MM=40001;
int s,t,n,a[MM],b[MM],c[MM],son[MM][2],dfn[MM];
long long f[81][41][41];
void dfs(int now,int dep,int Dfn)
{
//cout<<now<<' '<<Dfn<<endl;
dfn[now]=Dfn;
if(now<n)
{
dfs(son[now][0],dep+1,dfn[now]+1);
dfs(son[now][1],dep+1,dfn[now]+2);
for(int i=0;i<=dep;i++)
for(int j=0;j<=dep;j++)
f[dfn[now]][i][j]=min(f[dfn[son[now][0]]][i][j]+f[dfn[son[now][1]]][i][j+1],f[dfn[son[now][0]]][i+1][j]+f[dfn[son[now][1]]][i][j]);
}
if(now>=n)
for(int i=0;i<=dep;i++)
for(int j=0;j<=dep;j++)
f[dfn[now]][i][j]=1ll*c[now]*(a[now]+i)*(b[now]+j); }
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
cin>>s>>t;
if(s>0)
son[i][0]=s;
else
son[i][0]=-s+n-1;
if(t>0)
son[i][1]=t;
else
son[i][1]=-t+n-1;
}
for(int i=n;i<=2*n-1;i++)
cin>>a[i]>>b[i]>>c[i];
dfs(1,1,1);
cout<<f[1][0][0];
return 0;
}
树形dp空间优化(dfn)的更多相关文章
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- Codeforces 1179D 树形DP 斜率优化
题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...
- [SHOI2007] 书柜的尺寸 思维题+Dp+空间优化
Online Judge:Luogu-P2160 Label:思维题,Dp,空间优化 题面: 题目描述 给\(N\)本书,每本书有高度\(Hi\),厚度\(Ti\).要摆在一个三层的书架上. 书架的宽 ...
- POJ 1155 (树形DP+背包+优化)
题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...
- HDU - 5909 Tree Cutting (树形dp+FWT优化)
题意:树上每个节点有权值,定义一棵树的权值为所有节点权值异或的值.求一棵树中,连通子树值为[0,m)的个数. 分析: 设\(dp[i][j]\)为根为i,值为j的子树的个数. 则\(dp[i][j\o ...
- lightoj 1145 - Dice (I)(dp+空间优化+前缀和)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1145 题解:首先只要是dp的值只和上一个状态有关系那么就可以优化一维,然后这题 ...
- 部分树形DP的优化
ural1018. Binary Apple Tree 题目大意 有一棵n个节点的树,树上每个节点有一个值,选择m个节点使这些节点值的和最大 要求:如果选当前节点,则必须选它的父节点 解法: 我们设d ...
- Ural 1018 (树形DP+背包+优化)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...
- 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)
有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...
随机推荐
- JAVA地址通过百度地图API转化为经纬度
public static Map getLngAndLat(String address) { Map map = new HashMap(); String url = "http:// ...
- Centos 查询端口被占用命令
lsof -i:端口号 netstat -ntulp | grep 80 //查看所有80端口使用情况
- JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期
需要使用jdk1.8及以上 /** * 获取当前日期所在季度的开始日期和结束日期 * 季度一年四季, 第一季度:1月-3月, 第二季度:4月-6月, 第三季度:7月-9月, 第四季度:10月-12月 ...
- 年底了是时候学新技术了「GitHub 热点速览 v.21.52」
作者:HelloGitHub-小鱼干 年底了,又有新技术冒出来需要你来 Pick 了,第一个先要被 Pick 的是即将到来的元旦英文版:Happy New Year,再来的话就是这周非常火的新一代爬虫 ...
- 【LeetCode】1579. 保证图可完全遍历 Remove Max Number of Edges to Keep Graph Fully Traversable
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 并查集 代码 欢迎加入组织 日期 题目地址:https ...
- 【LeetCode】146. LRU Cache 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+双向链表 日期 题目地址:https://le ...
- 【LeetCode】959. Regions Cut By Slashes 由斜杠划分区域(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 代码 日期 题目地址:https://leetcod ...
- 【LeetCode】551. Student Attendance Record I 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则表达式 统计 日期 题目地址:https://l ...
- 【LeetCode】209. Minimum Size Subarray Sum 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/minimum- ...
- 『学了就忘』vim编辑器基础 — 95、命令模式中的相关命令
目录 1.移动光标操作 2.删除或剪切操作 3.复制操作 4.撤销操作 5.替换操作 6.补充一个知识点 命令模式中的命令主要取代的是Linux系统中鼠标的操作. vim编辑器的快捷键一般都集中在命令 ...