hdoj4276(树形dp+分组背包)
时间:2019-10-20
本文章向大家介绍hdoj4276(树形dp+分组背包),主要包括hdoj4276(树形dp+分组背包)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://vjudge.net/problem/HDU-4276
题意:给出一棵树,起点为1,时间为V,终点为n,每个点有一个价值a[u],每条边有一个时间花费w,求在时间V内到达终点n可以获得的最大价值。
思路:
考虑边有两种情况,一种是属于1->n路径上的(只用走一次),一种是不属于该路径上的(需要走两次),为了统一,不妨把V减去1-n路径上的权值和,然后把1->n路径上边的权值置为0。
此时就转换为求在起点1,在时间V内回到起点的最大价值。用dp[u][j]表示在点u有时间j,最后回到点u的最大价值,dp[u][j]初始化为a[u](0<=j<=V),转移方程为:
dp[u][j]=max(dp[u][j],dp[u][j-tmp-k]+dp[v][k]。
其中v为u的子结点,tmp=2×w(u,v)。
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,V,a[105],e[105][105],dp1[105],dp2[105][505]; void dfs1(int u,int fa){ dp1[u]=-1; if(u==n) dp1[u]=0; for(int i=1;i<=n;++i) if(e[u][i]!=-1){ if(i==fa) continue; dfs1(i,u); if(dp1[i]!=-1){ dp1[u]=dp1[i]+e[u][i]; e[u][i]=e[i][u]=0; } } } void dfs2(int u,int fa){ for(int j=0;j<=V;++j) dp2[u][j]=a[u]; for(int i=1;i<=n;++i) if(e[u][i]!=-1){ if(i==fa) continue; dfs2(i,u); int tmp=2*e[u][i]; for(int j=V;j>=tmp;--j) for(int k=0;k<=j-tmp;++k) dp2[u][j]=max(dp2[u][j],dp2[u][j-tmp-k]+dp2[i][k]); } } int main(){ while(~scanf("%d%d",&n,&V)){ for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) e[i][j]=-1; for(int i=1;i<n;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); e[u][v]=e[v][u]=w; } for(int i=1;i<=n;++i) scanf("%d",&a[i]); dfs1(1,0); if(V<dp1[1]){ printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n"); continue; } V-=dp1[1]; dfs2(1,0); printf("%d\n",dp2[1][V]); } return 0; }
原文地址:https://www.cnblogs.com/FrankChen831X/p/11706809.html
- 如何通过Google来使用ggplot2可视化
- 【直播】我的基因组54:把我的variation跟dbSNP数据库相比较
- 【翻译】MongoDB指南/引言
- TensorFlow从0到1 | 第十二章:TensorFlow构建3层NN玩转MNIST
- 如何通过预加载器提升网页加载速度
- 分钟学会正则表达式(译)
- TensorFlow从0到1 | 第十一章 74行Python实现手写体数字识别
- 让浏览器不再显示 https 页面中的 http 请求警报
- 跨域访问和防盗链基本原理
- 【翻译】MongoDB指南/CRUD操作(一)
- 【直播】我的基因组50:从测序深度和位点间距来看SNV分布情况
- 【翻译】MongoDB指南/CRUD操作(二)
- 【翻译】MongoDB指南/CRUD操作(三)
- 为什么 Laravel 会成为最成功的 PHP 框架?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java工具类(邮箱发送)
- 数据库调优 项目调优
- springboot 自动配置和拦截器相关
- Hive函数
- java创建本地缓存模拟redis缓存操作
- Python学习笔记(一)
- Python学习笔记(三)
- 文件下载,excel导出
- Flutter基础widgets教程-CupertinoButton篇
- 几款好用的开源工具类
- Linux部署之Docker方式部署项目
- Flutter基础widgets教程-CupertinoFullscreenDialogTransition篇
- mapper.xml相关语法
- Flutter基础widgets教程-CupertinoNavigationBar篇
- Hive排序函数