[jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)
interlinkage:
https://jzoj.net/senior/#contest/show/2703/0
description:
solution:
- 注意到这本质就是一个背包,只是选了一个点就必须把它到根节点的所有的点都选上
- 考虑如何转移这个背包,发现一个点要么转移到$dfs$序比它大$1$的点上,要么转移到比这个点子树中$dfs$序最大的点的$dfs$序大$1$的点上
- 前者表示这条链继续选,后者表示放弃这条链
- 易得所有的状态都会被转移到
- 这是一个很经典的问题
code:
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std; const int N=5e3+;
const int M=1e4+;
int n,p,ans,tot,tim;
int w[N],f[N],v[N],head[N],dp[N][M],id[N],st[N],ed[N];
struct EDGE
{
int to,nxt;
}edge[N<<];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void add(int u,int v)
{
edge[++tot]=(EDGE){v,head[u]};
head[u]=tot;
}
void dfs(int x)
{
st[x]=++tim;id[tim]=x;
for (int i=head[x];i;i=edge[i].nxt)
dfs(edge[i].to);
ed[x]=tim;
}
int main()
{
freopen("medicine.in","r",stdin);
freopen("medicine.out","w",stdout);
n=read();p=read();
w[]=read();f[]=read();v[]=read();
for (int i=;i<=n;i++)
{
w[i]=read();f[i]=read();v[i]=read();
add(f[i],i);
}
dfs();
memset(dp,-0x3f,sizeof(dp));
dp[][]=;
for (int i=;i<=tim;i++)
{
int x=id[i];
for (int j=;j<=p;j++) if (dp[i][j]>=)
{
if (j+w[x]<=p) dp[i+][j+w[x]]=max(dp[i+][j+w[x]],dp[i][j]+v[x]);
dp[ed[x]+][j]=max(dp[ed[x]+][j],dp[i][j]);
ans=max(ans,dp[i][j]);
}
}
for (int i=;i<=p;i++) ans=max(ans,dp[tim+][i]);
printf("%d\n",ans);
return ;
}
[jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)的更多相关文章
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- 背单词(AC自动机+线段树+dp+dfs序)
G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...
- [jzoj 6073] 河 解题报告 (DP)
interlinkage: https://jzoj.net/senior/#main/show/6073 description: solution: 考虑一条河$x$被染的效果 显然对于一条河$i ...
- ACM: HDU 1028 Working out 解题报告-DP
Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...
- [jzoj 3175] 数树数 解题报告 (树链剖分)
interlinkage: https://jzoj.net/senior/#main/show/3175 description: 给定一棵N 个节点的树,标号从1~N.每个点有一个权值.要求维护两 ...
- [NOIP2017] 逛公园 解题报告(DP)
我很不想说 在我的AC代码上我打了表,但实在没有办法了.莫名的8,9个点RE.然而即便是打表...也花了我很久. 这大概是NOIP2017最难的题了,为了让不懂的人更容易理解,这篇题解会比较详细 我的 ...
随机推荐
- 创建我们第一个Monad
上一篇中介绍了如何使用amplified type, 如IEnumerable<T>,如果我们能找到组合amplified type函数的方法,就会更容易写出强大的程序. 我们已经说了很多 ...
- hihoCoder挑战赛32
Rikka with Sequence V 构造 #pragma comment(linker, "/STACK:102400000,102400000") #include< ...
- JavaScript操作HTML&CSS简单入门
- Java攻城狮学习路线 - 一. JavaScript基础 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 ...
- vue.js怎样将时间戳转化为日期格式
<!-- value 格式为13位unix时间戳 --><!-- 10位unix时间戳可通过value*1000转换为13位格式 --> export function for ...
- Js中的4个事件
除了加载文档的事件onload和鼠标相关的一些事件如onclick,onmouseover等.js还有一些相对不常用的事件,这些事件也有各自的应用场景,本文就介绍 onkeydown,oncontex ...
- iframe子页面调用父页面js函数
window.parent.document.getElementById("test").value; jQuery方法为: $(window.parent.document). ...
- input左减右加
<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...
- CentOS7安装GitLab、汉化、邮箱配置及使用(转载)
同步首发: https://www.cnblogs.com/heyonggang/p/7778203.html http://www.yuanrengu.com/index.php/20171112. ...
- Map之HashMap的get与put流程,及hash冲突解决方式
在java中HashMap作为一种Map的实现,在程序中我们经常会用到,在此记录下其中get与put的执行过程,以及其hash冲突的解决方式: HashMap在存储数据的时候是key-value的键值 ...
- input type=”file“ change事件只执行一次的问题
js解决办法 HTML:<input id="file",type="file" onchange="upload()" /> ...