[bzoj1812][ioi2005]riv(树上dp)
来源:互联网 发布:酒鬼蔷薇圣斗 知乎 编辑:程序博客网 时间:2024/05/22 08:20
【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1812
【解题思路】转化为二叉树更方便。可以从Bytetown向后dp同时记录每个点在Bytetown方向上的最近锯木厂以满足无后效性。
【呆马】
f[i][j][k]表示第i棵子树,最近锯木厂为j,子树内可再建锯木厂为k
#include<cstdio>#include<algorithm>#include<cmath>#include<cstdlib>#include<iostream>#include<cstring>const int inf=2*(1e9);using namespace std;struct st{int to,next,v;} e[101];int n,cnt,k,x,y,i,d[101],v[101],f[101][101][51],l[101],r[101],fi[101];void add(int x,int y,int z){e[++cnt].to=y; e[cnt].next=fi[x]; e[cnt].v=z; fi[x]=cnt;}void dfs(int x){ for (int i=fi[x];i;i=e[i].next) { d[e[i].to]=d[x]+e[i].v; dfs(e[i].to); }}int dp(int i,int j,int k){ if (f[i][j][k]>=0) return f[i][j][k]; f[i][j][k]=inf; for (int p=0;p<=k;p++) { int t=v[i]*(d[i]-d[j]); if (l[i]) t+=dp(l[i],j,p); if (r[i]) t+=dp(r[i],j,k-p); f[i][j][k]=min(f[i][j][k],t); if (p<k) { t=0; if (l[i]) t+=dp(l[i],i,p); if (r[i]) t+=dp(r[i],j,k-1-p); f[i][j][k]=min(f[i][j][k],t); } } return f[i][j][k];}int main(){ scanf("%d%d\n",&n,&k); for (i=1;i<=n;i++) { scanf("%d%d%d\n",&v[i],&x,&y); add(x,i,y); if (!l[x]) l[x]=i; else r[i]=l[x],l[x]=i; } dfs(0); memset(f,-1,sizeof(f)); printf("%d",dp(0,0,k));}
0 0
- [bzoj1812][ioi2005]riv(树上dp)
- bzoj1812[Ioi2005] riv
- BZOJ1812 RIV 树形dp
- 【bzoj 1812】[Ioi2005]riv(树形dp)
- IOI2005 RIV 树形DP
- bzoj 1812: [Ioi2005]riv (树形dp+多叉树转二叉树)
- BZOJ 1812 Ioi2005 riv 树形dp
- BZOJ 1812: [Ioi2005]riv
- bzoj 1812: [Ioi2005]riv
- 1812: [Ioi2005]riv
- Tree (树上期望dp)
- IOI2005 [动态规划 树形DP] 河流
- [bzoj1040][ZJOI2008]骑士(树上dp)
- [bzoj2435][Noi2011]道路修建(树上dp)
- [bzoj1060][ZJOI2007]时态同步(树上dp)
- [bzoj1912][Apio2010]patrol 巡逻(树上dp)
- [bzoj1063][Noi2008]道路设计(树上dp)
- [bzoj1369][Baltic2003]Gem(树上dp)
- js 跨域详解
- hdu 1869 六度分离(floyd)
- POJ 1988 Cube Stacking
- Spring容器注入bean
- poj 3641 Pseudoprime numbers
- [bzoj1812][ioi2005]riv(树上dp)
- javaScript实现简单的表单验证
- Android实现OCR扫描识别数字图片之图片扫描识别
- 在屏幕中显示单选框
- 利用泛型封装DAO层(万能DAO)
- HDC与CDC相互转换
- Java进阶(三十七)java 自动装箱与拆箱
- MFC之菜单资源详解
- 玩转Easy UI框架的artDialog(四)常用实例