[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+15;
const int M=1e4+15;
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<<1];
inline int read()
{
    char ch=getchar();int s=0,f=1;
    while (ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) f=-1;ch=getchar();}
    while (ch>=‘0‘&&ch<=‘9‘) {s=(s<<3)+(s<<1)+ch-‘0‘;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[1]=read();f[1]=read();v[1]=read();
    for (int i=2;i<=n;i++)
    {
        w[i]=read();f[i]=read();v[i]=read();
        add(f[i],i);
    }
    dfs(1);
    memset(dp,-0x3f,sizeof(dp));
    dp[1][0]=0;
    for (int i=1;i<=tim;i++)
    {
        int x=id[i];
        for (int j=0;j<=p;j++) if (dp[i][j]>=0)
        {
            if (j+w[x]<=p) dp[i+1][j+w[x]]=max(dp[i+1][j+w[x]],dp[i][j]+v[x]);
            dp[ed[x]+1][j]=max(dp[ed[x]+1][j],dp[i][j]);
            ans=max(ans,dp[i][j]);
        }
    }
    for (int i=0;i<=p;i++) ans=max(ans,dp[tim+1][i]);
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/xxzh/p/10668919.html

时间: 2024-10-13 04:31:54

[jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)的相关文章

HDOJ5692解题报告【dfs序+线段树】

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=5692 题目概述: 中文题面就不赘述了. 大致思路: 这个题给出的是一棵树,我们可以使用dfs序将这棵树处理成一条链,然后对这条链来进行信息维护和查询. 有两种操作,0 x是询问从0出发(题目保证0为树根)经过x的路径中的最大权值,1 x y是将点x的权值修改成y,这时我们用线段树来维护一个d[i]表示点i到0点的权值和. 对于第一种操作就是查询x及其子树上的最大值,经过dfs序的处理之后这是一段连

HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形dp, 对于每条链u,v,w,我们只在lca(u,v)的顶点上处理它 让dp[i]表示以i为根的指数的最大值,sum[i]表示dp[vi]的和(vi为i的儿子们) 则i点有两种决策,一种是不选以i为lca的链,则dp[i]=sum[i]. 另一种是选一条以i为lca的链,那么有转移方程:dp[i]=

[HNOI2014][BZOJ3572] 世界树|虚树|树上倍增LCA|树型dp|dfs序

3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 555  Solved: 319[Submit][Status][Discuss] Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持续运转的根本基石.    世界树的形态可以用一个数学模型来描述:世界树中有n个种

[jzoj 3175] 数树数 解题报告 (树链剖分)

interlinkage: https://jzoj.net/senior/#main/show/3175 description: 给定一棵N 个节点的树,标号从1~N.每个点有一个权值.要求维护两种操作:1. C i x(0<=x<2^31) 表示将i 点权值变为x2. Q i j x(0<=x<2^31) 表示询问i 到j 的路径上有多少个值为x的节点 solution: 链剖 把颜色离散化,对每种颜色分别搞一颗线段树 直接搞会炸空间,因此要动态开点 感觉树上莫队好像也可以

poj分类解题报告索引

图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Journey poj1724 - ROADS(邻接表+DFS) BFS poj3278 - Catch That Cow(空间BFS) poj2251 - Dungeon Master(空间BFS) poj3414 - Pots poj1915 - Knight Moves poj3126 - Prim

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报