洛谷P3354 [IOI2005]Riv 河流——“承诺”DP
题目:https://www.luogu.org/problemnew/show/P3354
状态中要记录一个“承诺”,只需相同承诺之间相互转移即可;
然后就是树形DP的套路了。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int n,m,head[105],ct,siz[105],fa[105],len[105]; ll ed[105],f[105][55][105][3];//点,伐木场个数,前伐木场,是否有伐木场 ll a[105],c[105][105];//c:从i到j代价 struct N{int to,next;ll w;N(int t=0,int n=0,ll w=0):to(t),next(n),w(w) {} }edge[100005]; void init(int cr,int cnt,ll dis,int nw) {c[cr][cnt]=dis*a[cr];if(cnt)f[cr][0][cnt][0]=c[cr][cnt];if(!nw){len[cr]=cnt;return;}init(cr,cnt+1,dis+ed[nw],fa[nw]); } void dfs(int x) {siz[x]=1;for(int j=1;j<=n;j++)f[x][j][0][1]=0;for(int k=1;k<=len[x];k++)f[x][1][k][1]=0;for(int i=head[x],v;i;i=edge[i].next){dfs(v=edge[i].to);for(int j=min(m,siz[x]+siz[v]);j>=0;j--){for(int k=0;k<=len[x];k++){f[x][j][k][0]+=min(f[v][0][k+1][0],f[v][0][k+1][1]);f[x][j][k][1]+=min(f[v][0][1][0],f[v][0][1][1]);for(int l=max(1,j-siz[x]);l<=j&&l<=siz[v];l++){f[x][j][k][0]=min(f[x][j][k][0],f[x][j-l][k][0]+min(f[v][l][k+1][0],f[v][l][k+1][1]));f[x][j][k][1]=min(f[x][j][k][1],f[x][j-l][k][1]+min(f[v][l][1][0],f[v][l][1][1]));}}}siz[x]+=siz[v];} } int main() {scanf("%d%d",&n,&m);for(int i=1,x;i<=n;i++){scanf("%lld%d%lld",&a[i],&x,&ed[i]);edge[++ct]=N(i,head[x],ed[i]);head[x]=ct;fa[i]=x;}memset(f,1,sizeof f);f[0][0][0][0]=0;//!for(int i=1;i<=n;i++)init(i,0,0,i);dfs(0);printf("%lld",f[0][m][0][0]);return 0; }
转载于:https://www.cnblogs.com/Zinn/p/9139344.html
洛谷P3354 [IOI2005]Riv 河流——“承诺”DP相关推荐
- 洛谷 P3354 [IOI2005]Riv 河流【树形dp】
... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出一棵有nnn个节点的树,每条边有一个距离,每个点有一个权值 我们需要选出除根节点以外的kkk个节点,每个点的答案为该点的点权向上直到 ...
- P3354 [IOI2005]Riv 河流
树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...
- [LUOGU] P3354 [IOI2005]Riv 河流
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...
- Luogu P3354 [IOI2005]Riv河流 题解———再加一维!再加一维!
Description n≤100,k≤min(n,50)n≤100,k≤min(n,50)n≤100,k≤min(n,50). Solution 考虑树形dpdpdp. 状态设计为dpi,jdp_{ ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 【bzoj 1812】[Ioi2005]riv(树形dp)
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 433 Solved: 246 [Submit][Status] ...
- 洛谷P4322 最佳团伙(树上dp)
题目描述 洛谷传送门 题目描述 JSOI 信息学代表队一共有 N 名候选人,这些候选人从 1 到 N 编号.方便起见,JYY 的编号是 0 号.每个候选人都由一位编号比他小的候选人Ri推荐.如果 Ri ...
- [IOI2005]Riv河流
题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...
- BZOJ.1812.[IOI2005]Riv 河流(树形背包)
BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...
最新文章
- Python 国际化
- HashMap 1.7工作原理
- mysql+php+服务器配置_php服务器配置(php+mysql+iis)步骤
- 逆向工具之IDA的使用
- Java递归实现二分法
- 03-命令图片.doc
- mysql读写分离-借助中间键mycat
- 计算机组成原理 试讲,常州信息职业技术学院-试讲ppt-计算机组成原理-信息表示.ppt...
- Java、Python网页项目,纯前端项目,无后端参考代码,谨慎下载,全网可视性超强Web项目,免费源码,Js、Html、Css组合网页,可衔接数据库,数据可自行修改,可使用SSM、SpringBoo
- 项目文档编制-投标书
- SpringBoot -> 自动装配初探,debug=ture判断配置类是否生效
- 计算机系统变更注意事项,电脑更换cpu注意事项
- 解决Ubuntu18.04网易云音乐打不开的问题
- 微信企业号突飞猛进,移步到微为何坐稳移动审批头把交椅
- point类型的数组java_Java基础学习之引用类型数组访问NullPoint问题
- 光流.flo文件处理
- 腾讯云服务器如何安装应用软件,腾讯云服务器Ubuntu环境下通过Apt-get安装软件...
- [原创]使用Adobe Audition进行内录
- 恒生电子实习记录-13
- RuntimeError: cuda runtime error (30) : unknown error at /pytorch/aten/src/THC/THCGeneral.cpp:50