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就行了 ...
随机推荐
- 项目Alpha冲刺Day11
一.会议照片 二.项目进展 1.今日安排 熟悉框架的使用以及编写用户查看的界面以及该页面内的操作. 2.问题困难 全局的日期转换出现问题,在序列化的时候是按照配置来的,但是反序列化的时候就错了,问题待 ...
- 20145237 实验二 “Java面向对象程序设计”
20145237 实验二 “Java面向对象程序设计” 实验内容 • 理解并掌握面向对象三要素:封装.继承.多态 • 初步掌握UML建模 • 熟悉S.O.L.I.D原则 • 使用TDD设计实现复数类 ...
- HTML5文件操作API
HTML5文件操作API 一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...
- 算法题丨Remove Element
描述 Given an array and a value, remove all instances of that value in-place and return the new length ...
- SpringCloud的服务注册中心(四)- 高可用服务注册中心的搭建
一.双 服务注册注册中心 1.服务注册中心的服务端 - EurekaServer 1.1.EurekaServer1 String.application.name=eureka-server ser ...
- angular2 学习笔记 ( Dynamic Component 动态组件)
更新 2018-02-07 详细讲一下 TemplateRef 和 ViewContainerRef 的插入 refer : https://segmentfault.com/a/1190000008 ...
- 2018年Web前端自学路线
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. Web前端入门的自学路线 新手入门前端,需要学习的基础内容有很多,如下. ...
- jprofiler配置
cataline.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jprofilerti=port=8849"JAVA_OPTS="$JAVA_OP ...
- java中数组、list、泛型集合的长度
1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...