树形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 ...
随机推荐
- host-manager does not exist or is not a readable directory
当tomcat启动出现这个错误时,按照如下步骤可以解决: 1.删掉F:\tomcat20111101\apache-tomcat-6.0.26\conf\Catalina目录下的localhost文件 ...
- vue 判断页面是否滚动到底部
需求 要求用户阅读完本页所有内容后,下一步按钮才可以点击. 实现思路 通过判断当前页面是否到达底部来设置按钮的点击事件. 要判断当前页面是否到达底部需要用到三个距离--距离顶部的距离scrollTop ...
- Linux使用tar解压的时候去掉父级目录
去除解压目录结构使用 --strip-components N 如: 压缩文件text.tar 中文件信息为 src/src1/src2/text.txt 运行 tar -zxvf text.tar ...
- 反解ios静态库
p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...
- 【LeetCode】973. K Closest Points to Origin 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...
- hdu-1593 find a way to escape(贪心,数学)
思路:两个人都要选取最优的策略. 先求外层那个人的角速度,因为他的角速度是确定的,再求内层人的当角速度和外层人一样时的对应的圆的半径r1.外层圆的半径为d; 那么如果r1>=外围圆的半径,那么肯 ...
- 1083 - Histogram
1083 - Histogram PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 MB A hist ...
- @Transactional 失效
1.Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用. @Transactional void insertTestWrongModi ...
- 【C++】指针初始化
1.Node * p:if(p)//报错 2.Node * p=NULL;if(p)//不报错 注意把指针初始化,否则指针将指向任意位置
- 如何基于LSM-tree架构实现一写多读
一 前言 PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性.海量存储.高性能.低成本的数据库服务.X-Engine是阿里巴 ...