洛谷P4438 道路 [HNOI/AHOI2018] 树形dp
正解:树形dp
解题报告:
昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两条连边中选一条标记
然后对每个叶子节点i,设它到根节点经过了x条麻油被标记的左连边,y条麻油被标记的右连边,那它的贡献就会是ci*(ai-x)*(bi-y)
然后就考虑dp鸭
设f[x][i][j]:对于节点x,到达根的路径上有i条麻油标记的左连边,j条麻油标记的右连边
然后初始化是对叶子节点,直接枚举i和j
然后转移就是对非叶子节点,可以标记左连边可以标记右连边,就f[x][i][j]=min(f[x.ls][i][j]+f[x.rs][i][j+1],f[x.ls][i+1][j]+f[x.rs][i][j])
答案就是f[1][0][0]嘛
然后这题就做完辣!看起来好简单的样子
另外就是,这道题如果开的是f[N][40][40]显然是会爆空间的QAQ所以要想下怎么卡空间QAQ
然后仔细思考一下,因为这是一棵树,而且转移一定是从根dfs到儿子节点的,所以当两个儿子节点都访问完之后一定不会再回来辣
所以可以用,记录dfn的方式,这里的dfn并不是真正每次都++的那种(不然完全麻油省空间鸭QAQ),它是指的dfn[x.ls]=dfn[x]+1,dfn[x.rs]=dfn[x]+2,显然这样是可以保证正确性的,然后这样就能保障f的第一维<=2*40+1,这样就肯定不会爆空间辣!
然后记得它其实是有2*n-1个节点的,所以dfn序的那个数组要开两倍N,,,
虽然我jio得不会有人和我一样犯这种sd错误辣?
而且我居然RE了两三次才发现是这个问题,,,吃枣药丸TT
然后放下代码就溜辣!
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll long long
#define gc getchar()
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg int i=x;i>=y;--i) const int N=+;
int n,m,dfn[N];
long long f[][][];
struct node{int g,t;}nod[N];
struct leaf{int a,b,c;}lf[N]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(''<=ch && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void dfs(int x,int nw,int gl,int tl)
{
dfn[x]=nw;
if(x>=n){rp(i,,gl)rp(j,,tl)f[dfn[x]][i][j]=1ll*lf[x].c*1ll*(lf[x].a+i)*(lf[x].b+j);return;}
dfs(nod[x].g,nw+,gl+,tl);dfs(nod[x].t,nw+,gl,tl+);
rp(i,,gl)rp(j,,tl)f[dfn[x]][i][j]=min(f[nw+][i+][j]+f[nw+][i][j],f[nw+][i][j]+f[nw+][i][j+]);
} int main()
{
// freopen("dl.in","r",stdin);freopen("dl.out","w",stdout);
n=read();
rp(i,,n-){int s=read(),t=read();if(s>)nod[i].g=s;else nod[i].g=n-s-;if(t>)nod[i].t=t;else nod[i].t=n-t-;}rp(i,,n-)lf[i+n].a=read(),lf[i+n].b=read(),lf[i+n].c=read();
dfs(,,,);printf("%lld\n",f[][][]);
return ;
}
嗷对了这题还有一个解法来着QwQ
只是不管是时间上还是空间上都不太优秀,而且非常好想,就很适合我这种菜菜,然后居然能过,实在是很友好了TT
就直接无脑记搜就好,放下代码就能get了应该QAQ?
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll long long
#define gc getchar()
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll N=+;
ll n,m,f[N][][];
struct node{ll ls,rs;}nod[N];
struct leaf{ll a,b,c;}lf[N]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(''<=ch && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il ll dfs(ll x,ll i,ll j)
{
if(x>=n)return lf[x-n].c*(lf[x-n].a+i)*(lf[x-n].b+j);if(f[x][i][j]!=f[n+][][])return f[x][i][j];
return f[x][i][j]=min(dfs(nod[x].ls,i,j)+dfs(nod[x].rs,i,j+),dfs(nod[x].ls,i+,j)+dfs(nod[x].rs,i,j));
} int main()
{
// freopen("dl.in","r",stdin);
n=read();rp(i,,n-){ll s=read(),t=read();if(s>)nod[i].ls=s;else nod[i].ls=n-s-;if(t>)nod[i].rs=t;else nod[i].rs=n-t-;}rp(i,,n-)lf[i].a=read(),lf[i].b=read(),lf[i].c=read();
memset(f,,sizeof(f));printf("%lld\n",dfs(,,));
return ;
}
洛谷P4438 道路 [HNOI/AHOI2018] 树形dp的更多相关文章
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp
正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...
- 【题解】洛谷P1070 道路游戏(线性DP)
次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- 洛谷 P4201 设计路线 [NOI2008] 树形dp
正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...
- 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)
题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...
- 洛谷P1351 联合权值(树形dp)
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
- 洛谷P4099 [HEOI2013]SAO(树形dp)
传送门 HEOI的题好珂怕啊(各种意义上) 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关) 我们考虑 ...
- 洛谷 P1351 联合权值 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...
随机推荐
- IIS日志清理(VBS版,JS版)
IIS默认日志记录在C:\WINDOWS\system32\LogFiles,时间一长,特别是子站点多的服务器,一个稍微有流量的网站,其日志每天可以达到上百兆,这些文件日积月累会严重的占用服务器磁盘空 ...
- centos7/nginx/tornado错误异常收集
临时方法 – 设置系统参数 使用命令setenforce 附: setenforce 设置SELinux 成为enforcing模式 setenforce 设置SELinux 成为permissive ...
- UIImageView的contentMode属性
UIViewContentMode 都有哪些值: typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFil ...
- 解决一起web 页面被劫持的案例
现象 江西客户手机端连接wifi打开URL,页面上显示淘宝店铺广告,使用手机移动网络打开正常,其他地区正常. 二. 处理过程 初步分析:3g.club项目使用了CDN,目前只有江西异常,其他地区无异常 ...
- 【ipad神坑】ipad麦克风听不到声音怎么回事 微信QQ语音视频对方都听不到
今天遇到了这个问题 说话听不见,但是敲击ipad,可以明显的听到击打的声音 siri也是可以听到 上网上找,大多都是说恢复设置,重启,隐私麦克风权限等解决方案 都是浪费感情 全部尝试过了,依然没有用. ...
- android基础---->IntentService的使用
这一篇博客,我们开始前台服务与IntentServie源码分析的学习,关于service的生命周期及其简单使用,请参见我的博客:(android基础---->service的生命周期) 目录导航 ...
- eclipse中改变默认的workspace的方法
1.File-->Switch Workspace-->Other 2.Window-->Preferences-->General-->Startup and Shui ...
- 题目1016:火星A+B(进制新问题)
题目链接:http://ac.jobdu.com/problem.php?pid=1016 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- time_t到.NET DateTime的转换
time函数返回的time_t是一个utc时间且相对于1970年1月1日的total seconds,转换到DateTime只需以相同的方式转换回去即可. C/C++ auto t = time(); ...
- Egret中的三种单例写法
1 普通的单例写法 as3中也是这么个写法. 缺点:每个单例类里都要写instance和getInstance. class Single{ private static instance:Singl ...