jzoj5661 [GDOI2018Day1模拟4.17]药香沁鼻

标签: jzoj
7人阅读 评论(0) 收藏 举报
分类:

Description


给定一棵树,每个节点有价值和体积。已知选择一个节点需要满足它的父亲节点也被选择,根据给出的背包容量求能获得的最大价值

Solution


题目是图片懒得放惹

这种东西似乎是一类题目,也就是树形依赖背包
我们把树转化成dfs序,设f[i,j]表示从后往前做到第i个dfs序,体积为j的最大价值

dp柿子:f[i,j]=max(f[i+1,j-w[x]]+v[i],f[i+size[x],j])
可以理解为当前节点选择与否决定了以它为根的子树是否能被选

一开始漏掉了不选的情况然后GG了(这都能漏

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)

const int N=5005;
const int E=20005;

struct edge {int x,y,next;} e[E];

int w[N],v[N],f[N][N*2];
int pos[N],tot;
int size[N];
int ls[N],edCnt;

void add_edge(int x,int y) {
    if (x!=y) {
        e[++edCnt]=(edge) {x,y,ls[x]}; ls[x]=edCnt;
    }
}

void dfs(int now) {
    pos[++tot]=now;
    size[now]=1;
    for (int i=ls[now];i;i=e[i].next) {
        dfs(e[i].y);
        size[now]+=size[e[i].y];
    }
}

int main(void) {
    freopen("medicine.in","r",stdin);
    freopen("medicine.out","w",stdout);
    int n,m; scanf("%d%d",&n,&m);
    rep(i,1,n) {
        int fa; scanf("%d%d%d",&w[i],&fa,&v[i]);
        add_edge(fa,i);
    }
    dfs(1);
    drp(ti,n,1) {
        int i=pos[ti];
        rep(j,0,m) {
            if (j<w[i]) f[ti][j]=std:: max(f[ti+size[i]][j],0);
            else {
                f[ti][j]=std:: max(f[ti][j],f[ti+1][j-w[i]]+v[i]);
                f[ti][j]=std:: max(f[ti][j],f[ti+size[i]][j]);
            }
        }
    }
    printf("%d\n", f[1][m]);
    return 0;
}
查看评论

Struts快速入门(三)

利用ActionMapping的命令模式       Struts提供一个公开的基于XML语句的方法来说明请求URI中servlet路径与适当的请求处理器之间的映射。这个实现与命令模式[Gof]很相似...
  • icecloud
  • icecloud
  • 2003-05-13 11:03:00
  • 1767

jzoj 5661. 【GDOI2018Day1模拟4.17】药香沁鼻 dp

DescriptionInputOutputSample Input6 9 1 1 1 1 1 100 8 1 1 1 3 6 2 3 1000 4 1 4Sample Output105...
  • liangzihao1
  • liangzihao1
  • 2018-04-17 14:41:00
  • 18

【GDOI2018Day1模拟4.17】凫趋雀跃

Description: 题解:把(0,0)也视为一个kik_i。显然要容斥原理。枚举一个s,去求至少有s步是不合法的方案数。这个要dp三个东西。fi,jf_{i,j}表示走了i步,∑k\sum k...
  • Cold_Chair
  • Cold_Chair
  • 2018-04-19 21:02:49
  • 31

洛谷 P3808 【模板】AC自动机(简单版)

题目背景这是一道简单的AC自动机模板题。用于检测正确性以及算法常数。为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交。管理员提示:本题数据内有重复的单词,且重复单词应该计算多次,请各位注...
  • liangzihao1
  • liangzihao1
  • 2018-04-18 17:22:20
  • 9

jzoj 5662. 【GDOI2018Day1模拟4.17】尺树寸泓

题目大意: 思路: 平衡树很简单了,学过的大概多知道,推一推会发现,他的sum是和只有旋转点会变,mul所有的父亲都会变,在多次旋转后可能为一条链,那么时间复杂度就会爆炸。 这时我们可以...
  • qq872425710
  • qq872425710
  • 2018-04-17 21:00:12
  • 40

【GDOI2018Day1模拟4.17】药香沁鼻

题目 分析 首先求出这棵树的dfs序,设lx表示以x为根的子树中的dfs序最小值(即点x的dfs序),设rx表示以x为根的子树中的dfs序最大值。 然后按照dfs序枚举点,每个点维护一个背包...
  • A_loud_name
  • A_loud_name
  • 2018-04-17 18:54:57
  • 8

【JZOJ5661】【GDOI2018Day1模拟4.17】药香沁鼻(树形背包)

Problem   还剩P点能量值的小C要用N朵花煮药,每朵花i有三个信息: 1. 摘下它需要花Wi点能量; 2. 有一朵钦慕的花fi(保证1≤fi≤max(1,i-1)),煮药时,若fi不在药...
  • qq_36551189
  • qq_36551189
  • 2018-04-19 11:49:38
  • 12

Jzoj5661 药香沁鼻

有依赖关系的树形背包,算是又积累了一种做法 一个经典的做法就是设f[x][j]表示在x子树内,容量为j的最大获利 那么转移可以写成 f[x][j]=max{f[x][j],f[x][j-k]+f[...
  • JacaJava
  • JacaJava
  • 2018-04-20 20:56:36
  • 12

jzoj 5661. 【GDOI2018Day1模拟4.17】药香沁鼻

题目大意: 思路: 因为选y一定要先选x,所以这是一题0.1分数规划的树形依赖背包。(比较懒) 先用dfs把树转化成序列,如果cnt&amp;gt;W[I]那么就是可以装下的那么当先点的...
  • qq872425710
  • qq872425710
  • 2018-04-17 20:43:37
  • 16

【杜教筛】【GDOI2018Day1模拟4.17】呼吸决定

题意 求∑ni=1μ(i)∗im∑i=1nμ(i)∗im\sum_{i=1}^n μ(i)*i^m m&amp;lt;=2e5 n&amp;lt;=1e9 题解 设pi=μ(i)∗im|si...
  • Fate_Zero_Saber
  • Fate_Zero_Saber
  • 2018-04-18 21:48:30
  • 19
    个人资料
    持之以恒
    等级:
    访问量: 12万+
    积分: 8225
    排名: 3049
    乱七八糟
    文章分类
    最新评论