bzoj2427 软件安装! 树dp
软件安装
题目描述
现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi。我们希望从中选择一 些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大)。
但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j)。幸运的 是,一个软件最多依赖另外一个软件。如果一个软件不能正常工作,那么它能够发挥的作用为0。
我们现在知道了软件之间的依赖关系:软件i依赖软件Di。现在请你设计出一种方案,安装价值尽量大的软件。一个软件只能被安装一 次,如果一个软件没有依赖则Di=0,这时只要这个软件安装了,它就能正常工作。
输入格式
第1行:N,M (0<=N<=100.0<=M<=500)
第2行:W1,W2,…,Wi,…,Wn(0<=Wi<=M)
第3行:V1,V2,…,Vi,…,Vn(0<=Vi<=1000)
第4行:D1,D2,…,Di,…,Dn(0<=Di<=N,Di≠i)
输出格式
一个整数,代表最大价值。
样例
样例输入
3 10
5 5 6
2 3 4
0 1 1
样例输出
5
没什么好说的。
非常简单的树dp
10分算法
其实是你dp打错了才会10分。
1个注意点(由于博主沙雕打法导致的)
if(x!=0)
{
for(ll j=m;j>=w1[x];j--)
f[x][j]=f[x][j-w1[x]]+v1[x];
for(ll j=w1[x]-1;j;j--)
f[x][j]=0;
}
没清零!(上面给它赋值了但实施上它本来就不该有值)
40分算法
没打tarjan就会40分。
事实上当你发现你一直40wrong ans并且改不出来时就应该想想tarjan
100分
如果打了tarjan就100分了。
和某个叫「选课」的题特别像。
选课会打这个就会。
以下是本人丑陋的代码。
#include<bits/stdc++.h>
#define ll long long
#define A 2100
using namespace std;
ll ver[A],f[A][A],fa[A],dis[A],deep[A],chatot=0,root,sum[A],w[A],d[A],v[A],num=0,top=0,ins[A],sta[A],dfn[A],low[A],cnt=0,scc[110][110],belong[A];
ll head2[A],head[A],nxt[A],nxt2[A],ver2[A],tot2=0,tot=0,du[A],v1[A],w1[A];
bool flag[A],vis[A];
ll n,m,k,t,xx,yy,zz;
inline ll read(){ll f=1,x=0;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void add(ll x,ll y){fa[y]=x,ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;}
inline void add2(ll x,ll y){ver2[++tot2]=y,nxt2[tot2]=head2[x],head2[x]=tot2;}
inline void rebuilt()
{
for(ll i=1;i<=n;i++)
{
for(ll j=head[i];j;j=nxt[j])
{
ll y=ver[j];
if(belong[y]!=belong[i])
add2(belong[i],belong[y]),du[belong[y]]++;
}
}
}
inline ll tarjan(ll x)
{
dfn[x]=low[x]=++num;
sta[++top]=x;ins[x]=1;
for(ll i=head[x];i;i=nxt[i])
{
ll y=ver[i];
if(dfn[y]==0)
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
++cnt;
ll yy=0;
while(1)
{
yy=sta[top--];
ins[yy]=0;
belong[yy]=cnt;
v1[cnt]+=v[yy];
w1[cnt]+=w[yy];
if(yy==x)
break; }
}
}
void dfs(ll x)
{
f[x][0]=0;
for(ll i=head2[x];i;i=nxt2[i])
{
ll y=ver2[i];
dfs(y);
for(ll j=m;j>=0;j--)
for(ll k=j;k>=0;k--)
f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
}
if(x!=0)
{
for(ll j=m;j>=w1[x];j--)
f[x][j]=f[x][j-w1[x]]+v1[x];
for(ll j=w1[x]-1;j;j--)
f[x][j]=0;
}
}
int main()
{
n=read(),m=read();
for(ll i=1;i<=n;i++)
w[i]=read();
for(ll i=1;i<=n;i++)
v[i]=read();
for(ll i=1;i<=n;i++)
{
d[i]=read();
add(d[i],i);
}
for(ll i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
rebuilt();
for(ll i=1;i<=cnt;i++)
{
if(!du[i])
add2(0,i);
}
dfs(0);
cout<<f[0][m]<<endl;
}
bzoj2427 软件安装! 树dp的更多相关文章
- [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1987 Solved: 791[Submit][Statu ...
- BZOJ2427:[HAOI2010]软件安装(树形DP,强连通分量)
Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...
- [BZOJ2427]软件安装
Problem 每个软件都要安装某些软件才能安装,而且都有体积和价值,求安装的价值最大值 Solution 对于每个环,我们可以知道必须全部一起取或者不取,因此我们先用Tarjan缩点 然后我们用一个 ...
- [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP
题目大意 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
- [BZOJ2427]:[HAOI2010]软件安装(塔尖+DP)
题目传送门 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用${W}_{i}$的磁盘空间,它的价值为${V}_{i}$.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件 ...
- bzoj2427: [HAOI2010]软件安装
Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...
- 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)
[BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...
- 题解【bzoj2427 [HAOI2010]软件安装】
Description 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到一台磁盘容量为\(M\)计算 ...
随机推荐
- 腾讯云原生混合云-第三方集群弹EKS应对突发流量的利器
作者 何鹏飞,腾讯云专家产品经理,曾作为容器私有云.TKEStack的产品经理兼架构师,参与腾讯云内部业务.外部客户容器化改造方案设计,目前负责云原生混合云产品方案设计工作. 胡晓亮,腾讯云专家工程师 ...
- OCR横向评测 -- 软工案例分析
目录 第一部分 调研&评测 使用感受 1. 使用门槛 2. 界面设计 3. 数据标注 4. 模型训练 5. 模型预测 6. 体验评价与改进建议 好的方面: 可能需要改进的方面: 7. BUG反 ...
- 痞子衡嵌入式:MCUBootUtility v3.3发布,可配合SBL项目使用
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个大版本(v3.0.0)发布过去4个多月了,期间痞子衡其实断断续续做个几个小版本更新,这一次痞子衡为大家带来了稳定版本v3.3.0,顺 ...
- 消息队列之 RabbitMQ【验证通过】
消息队列之 RabbitMQ 预流 关注 22.9 2017.05.06 16:03* 字数 4884 阅读 284691评论 41喜欢 618赞赏 2 关于消息队列,从前年开始断断续续看了些资料, ...
- CENTOS7network config文件不能直接bak 必须建立bak目录再bak
CENTOS7network config文件不能直接bak 必须建立bak目录再bak
- zabbix添加菜单栏
1.更改字体(中文乱码多半是因为字体不支持中文) define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans'); // font file name define('ZBX_ ...
- g77介绍 g77 是 Fortran77 的编译器。它对 Fortran 77 标准提供完备的支持,并支持 Fortran 90 和 95 的部分特性。 由于 Fortran 77 标准在数值计算中的影响力,g77 可能是应用最广的Fortran编译器。 在 GCC 4.0 之前,g77 是 GCC 的一部分,但现在,g77 已经停止开发。
GFORTRAN 维基百科,自由的百科全书 跳到导航 跳到搜索 此条目需要扩充. (2018年11月2日)请协助改善这篇条目,更进一步的信息可能会在讨论页或扩充请求中找到.请在扩充条目后将此模 ...
- 1.5 RPM红帽软件包1.6 Yum软件仓库
1.5 RPM红帽软件包 在RPM(红帽软件包管理器)公布之前,要想在Linux系统中安装软件只能采取源码包的方式安装.早期在Linux系统中安装程序是一件非常困难.耗费耐心的事情,而且大多数的服务程 ...
- HAProxy之三----keepalived配合脚本对HAProxy、ping网关实现高可用检测
调用脚本参数含义 vrrp_script<SCRIPT_NAME> { #定义一个检测脚本,在global_defs之外配置 script <STRING>|<QUOTE ...
- Linux_搭建Samba服务(认证访问)
[RHEL8]-SMBserver:[RHEL7]-SMBclient !!!测试环境我们首关闭防火墙和selinux(SMBserver和SMBclient都需要) [root@localhost ...