题目: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相关推荐

  1. 洛谷 P3354 [IOI2005]Riv 河流【树形dp】

    ... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出一棵有nnn个节点的树,每条边有一个距离,每个点有一个权值 我们需要选出除根节点以外的kkk个节点,每个点的答案为该点的点权向上直到 ...

  2. P3354 [IOI2005]Riv 河流

    树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...

  3. [LUOGU] P3354 [IOI2005]Riv 河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...

  4. 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_{ ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 【bzoj 1812】[Ioi2005]riv(树形dp)

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 433  Solved: 246 [Submit][Status] ...

  7. 洛谷P4322 最佳团伙(树上dp)

    题目描述 洛谷传送门 题目描述 JSOI 信息学代表队一共有 N 名候选人,这些候选人从 1 到 N 编号.方便起见,JYY 的编号是 0 号.每个候选人都由一位编号比他小的候选人Ri推荐.如果 Ri ...

  8. [IOI2005]Riv河流

    题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...

  9. BZOJ.1812.[IOI2005]Riv 河流(树形背包)

    BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...

最新文章

  1. Python 国际化
  2. HashMap 1.7工作原理
  3. mysql+php+服务器配置_php服务器配置(php+mysql+iis)步骤
  4. 逆向工具之IDA的使用
  5. Java递归实现二分法
  6. 03-命令图片.doc
  7. mysql读写分离-借助中间键mycat
  8. 计算机组成原理 试讲,常州信息职业技术学院-试讲ppt-计算机组成原理-信息表示.ppt...
  9. Java、Python网页项目,纯前端项目,无后端参考代码,谨慎下载,全网可视性超强Web项目,免费源码,Js、Html、Css组合网页,可衔接数据库,数据可自行修改,可使用SSM、SpringBoo
  10. 项目文档编制-投标书
  11. SpringBoot -> 自动装配初探,debug=ture判断配置类是否生效
  12. 计算机系统变更注意事项,电脑更换cpu注意事项
  13. 解决Ubuntu18.04网易云音乐打不开的问题
  14. 微信企业号突飞猛进,移步到微为何坐稳移动审批头把交椅
  15. point类型的数组java_Java基础学习之引用类型数组访问NullPoint问题
  16. 光流.flo文件处理
  17. 腾讯云服务器如何安装应用软件,腾讯云服务器Ubuntu环境下通过Apt-get安装软件...
  18. [原创]使用Adobe Audition进行内录
  19. 恒生电子实习记录-13
  20. RuntimeError: cuda runtime error (30) : unknown error at /pytorch/aten/src/THC/THCGeneral.cpp:50

热门文章

  1. 互联网摸鱼日报(2022-12-13)
  2. 《Adobe Illustrator CS5中文版经典教程》—第1课1.5节使用“导航器”面板
  3. 红外测试操作步骤_近红外光谱仪操作步骤_近红外光谱仪波长范围
  4. 品质网络的迭变之路,以及运营商的未来之匙
  5. 淘宝聚划算怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  6. 2020年FRM考试有哪几门?占比是多少?
  7. Java基础学习(2)---Java基础语法
  8. EDM营销做的最好的是哪个公司
  9. Panel自定义边框
  10. ubuntu下ati驱动安装