wikioi 1163 访问艺术馆 树形dp

递归建树,由题知该树是一棵二叉树,且除根节点外其他点的度为0或2。

dp[i][j]表示来到第i个走廊(还未走过这条走廊)还剩下j时间,能拿到最大的画的数量。

dp[i][j]=max(dp[i][j],dp[lson[i]][k]+dp[rson][last_time-k])

#include<cstdio>
#include<algorithm>
using namespace std;
int dp[200][700];
int id=0,x,y,s;
struct node
{
    int t,l,r;
    int v;
}tree[200];
void init(int now)
{
    scanf("%d%d",&x,&y);
    tree[now].t=x*2;
    tree[now].v=y;
    if(y!=0) tree[id].l=tree[id].r=-1;
    else
    {
        tree[now].l=++id;init(id);
        tree[now].r=++id;init(id);
    }
}
int dfs(int now,int times)
{
    if(dp[now][times]) return dp[now][times];       //记忆化
    int last=times-tree[now].t;
    if(last<0) return 0;
    if(tree[now].l==-1) return dp[now][times]=min(tree[now].v,last/5);
    int maxn=0;
    for(int i=0;i<=last;i++)
    {
        maxn=max(maxn,dfs(tree[now].l,i)+dfs(tree[now].r,last-i));  /*这里会调用多次已经计算过的值*/
                                                    //计算左儿子i时间,右儿子last-i时间的最大偷画数
    }
    return dp[now][times]=maxn;
}
int main()
{
    scanf("%d",&s);
    init(0);
    printf("%d\n",dfs(0,s));
    return 0;
}

wikioi 1163 访问艺术馆 树形dp

时间: 2025-01-02 03:58:15

wikioi 1163 访问艺术馆 树形dp的相关文章

wikioi 1163 訪问艺术馆 树形dp

递归建树,由题知该树是一棵二叉树,且除根节点外其它点的度为0或2. dp[i][j]表示来到第i个走廊(还未走过这条走廊)还剩下j时间,能拿到最大的画的数量. dp[i][j]=max(dp[i][j],dp[lson[i]][k]+dp[rson][last_time-k]) #include<cstdio> #include<algorithm> using namespace std; int dp[200][700]; int id=0,x,y,s; struct node

luogu1270 “访问”美术馆 树形dp

传送门 树形dp f[i][j] - 到i号点,已经j时间了的最大偷画数 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for(int i = a; i <= b; ++i) const int N = 107; const int S = 607; int s, n, f[N][S]; void dfs(int u) { int time, paint;

洛谷 P1270 “访问”美术馆(树形DP)

P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer知道每个展室里藏画的数量,并且他精确测量了通过每条走廊的时间.由于经验老到,他拿下一幅画需要5秒的时间.你的任务是编一个程序,计算在警察赶来之前,他最多能偷到多少幅画. 输入输出格式 输入格式: 第1行是警察赶到的时间,以s为单位.第2行描述了艺术馆的结构,是一串非负整数,成对地出现:每一对的第一个

1163 访问艺术馆

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间.你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画. 输入描述 Input

codvs 1163 访问艺术馆 树状动规

[问题描述] 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer知道每个展室里藏画的数量,并且他精确测量了通过每条走廊的时间.由于经验老到,他拿下一幅画需要5秒的时间.你的任务是编一个程序,计算在警察赶来前 ,他最多能偷到多少幅画. [输入格式] 第1行是警察赶到的时间,以秒为单位.第2行描述了艺术馆的结构,是一串非负整数,成对地出现:每一对的第一个数是走过一条走廊的时间,第2个数是它

codevs1163访问艺术馆(树形dp)

1163 访问艺术馆 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间.你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画. 输入描述 Input

codevs 访问艺术馆

/* codevs 1163 访问艺术馆 红果果的树形dp*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 210 using namespace std; int n,m,lc[maxn],rc[maxn],g[maxn][2],T,v[maxn],f[maxn][maxn*6],x,y; struct node{ int v,t,pre; }e[maxn*2]; void df

访问艺术馆 (Codevs No.1163)

2016-05-31 20:48:47 题目链接: 访问艺术馆 (Codevs No.1163) 题目大意: 一个贼要在一个二叉树结构的艺术馆中偷画,画都处于叶子节点处,偷画和经过走廊都需要时间,求在限定时间内可以偷到最大数量 解法: 树状DP (记忆化搜索实现) DP[i][j]表示到达i节点时还有j的时间来移动可以偷到的最大数量 状态转移: 对于叶子节点,直接按时间剩余返回最大偷画数量 对于非叶子节点,最大值可能来自Lson一边,也可能只来自Rson一边,还有可能是Lson,Rson按某种方

[DP总结]树形DP

树形DP 树形DP,顾名思义,是在树上进行DP操作,因此往往需要使用DP实现,在转移时,通常先递归求出子树中的解,再在根节点进行计算转移. 树中只有两种关系,一种是父子关系,一种是平行关系. 下面是几道简单的树形DP.从中我们可以窥出树形DP的本质. [luogu] P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是