P2515 [HAOI2010]软件安装
树形背包
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 110
#define MAXM 510
#define pii pair<int,int>
#define rint register int
#define mp make_pair
#define pb push_back
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int tot,m;
int C[MAXN],V[MAXN];
vector<int> G[MAXN];
int dfn[MAXN],low[MAXN],sta[MAXN],b[MAXN],top,idx;
int c[MAXN],v[MAXN],cmp[MAXN],n;
int fst[MAXN],nxt[MAXN],from[MAXN],to[MAXN],cnt,pin[MAXN];
void add(int x,int y){
nxt[++cnt]=fst[x],fst[x]=cnt,from[cnt]=x,to[cnt]=y;
pin[y]++;
}
void tarjan(int x){
dfn[x]=low[x]=(++idx);
sta[++top]=x,b[x]=;
int y;
for(rint i=;i<G[x].size();i++){
y=G[x][i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(b[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
n++;
while(sta[top+]!=x){
c[n]+=C[sta[top]];
v[n]+=V[sta[top]];
cmp[sta[top]]=n;
b[sta[top]]=;
top--;
}
}
}
int f[MAXN][MAXM],dep[MAXN];
int H[MAXM],H1[MAXM],H2[MAXM];
void work(int x,int vl){
if(vl<c[x]){f[x][vl]=;return;}
vl-=c[x];
memset(H,,sizeof(H));
memset(H1,,sizeof(H1));
int y,r=;
for(rint e=fst[x];e;e=nxt[e]){
y=to[e];
for(rint i=;i<=vl;i++){
H[i]=max(H[i],H1[i]+f[y][vl-i]);
r=max(r,H[i]);
}
memcpy(H1,H,sizeof(H));
}
f[x][vl+c[x]]=r+v[x];
}
void dp(int x){
b[x]=;
int y;
for(rint e=fst[x];e;e=nxt[e]){
y=to[e];
if(!b[y]){
dp(y);
for(rint j=m-c[x];j>=;j--){
for(rint k=;k<=j;k++){
f[x][j]=max(f[x][j],f[x][k]+f[y][j-k]);
}
}
}
}
for(rint j=m;j>=;j--){
if(j>=c[x]){
f[x][j]=f[x][j-c[x]]+v[x];
}
else{
f[x][j]=;
}
}
}
int main()
{
// freopen("data.in","r",stdin);
tot=read();m=read();
for(rint i=;i<=tot;i++)C[i]=read();
for(rint i=;i<=tot;i++)V[i]=read();
int tmp;
for(rint i=;i<=tot;i++){
tmp=read();
if(tmp)G[tmp].pb(i);
}
for(rint i=;i<=tot;i++){
if(!dfn[i])tarjan(i);
}
for(rint i=;i<=tot;i++){
for(rint j=;j<G[i].size();j++){
int x=i,y=G[i][j];
if(cmp[x]!=cmp[y]){
add(cmp[x],cmp[y]);
}
}
}
for(rint i=;i<=n;i++){
if(!pin[i]){
add(,i);
}
}
// for(rint i=1;i<=cnt;i++){
// printf("%d %d\n",from[i],to[i]);
// }
memset(b,,sizeof(b));
dp();
printf("%d\n",f[][m]);
return ;
}
P2515 [HAOI2010]软件安装的更多相关文章
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- 洛谷—— P2515 [HAOI2010]软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 洛谷 P2515 [HAOI2010]软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 洛谷——P2515 [HAOI2010]软件安装
https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...
- luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...
- [bzoj2427]P2515 [HAOI2010]软件安装(树上背包)
tarjan+树上背包 题目描述 现在我们的手头有 \(N\) 个软件,对于一个软件 \(i\),它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\).我们希望从中选择一些软件安装到一台磁 ...
- luogu P2515 [HAOI2010]软件安装
传送门 看到唯一的依赖关系,容易想到树型dp,即\(f_{i,j}\)表示选点\(i\)及子树内连通的点,代价为\(j\)的最大价值,然后就是选课那道题 但是要注意 1.题目中的依赖关系不一定是树,可 ...
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
随机推荐
- Linux下硬盘分区
1 fdisk -l查看硬盘及分区信息 我的系统(Archlinux)下的命令效果如下: 由上面的图片可以得知该系统只挂载了1个硬盘,命名为sda,其有2个主分区,sda1和sda2,至于为什么这么 ...
- 201621123031 《Java程序设计》第11周学习总结
作业11-多线程 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread ...
- 201621123031 《Java程序设计》第1周学习总结
作业01-Java基本概念 1.本周学习总结 1.本周学习内容:Java发展史(简述).Java语言特点.JDK .JRE .JVM .Java的开发步骤.Java开发工具. 2.关键概念之间的联系: ...
- 《高级软件测试》JIRA使用手册(二)JIRA安装
Jira Software 下载地址 Windows系统x86平台:https://downloads.atlassian.com/software/jira/downloads/atlassian- ...
- 在wamp集成环境下安装laravel5.2.*框架
虽然官方一直强烈推荐使用homestead,但是这个相对麻烦一点,所以我还是选择使用wamp集成开发环境.还有这里我只讲解windows系统下的安装,其他例如mac或linux就不写了,此文章是面向刚 ...
- nyoj水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- Python内置函数(58)——input
英文文档: input([prompt]) If the prompt argument is present, it is written to standard output without a ...
- python 鸭子类型
首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不 ...
- ASP.NET Web API编程——模型验证与绑定
1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型. 例如,Required特性表示字段值不能为空,Range特 ...
- 集合之深入理解HashMap
Hashmap是一种非常常用的.应用广泛的数据类型 1.hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个 ...