2016-05-31 20:48:47

题目链接: 访问艺术馆 (Codevs No.1163)

题目大意:

  一个贼要在一个二叉树结构的艺术馆中偷画,画都处于叶子节点处,偷画和经过走廊都需要时间,求在限定时间内可以偷到最大数量

解法:

  树状DP (记忆化搜索实现)

  DP[i][j]表示到达i节点时还有j的时间来移动可以偷到的最大数量

  状态转移:

    对于叶子节点,直接按时间剩余返回最大偷画数量  

    对于非叶子节点,最大值可能来自Lson一边,也可能只来自Rson一边,还有可能是Lson,Rson按某种方式分配时间得来

  话说这题按照深度优先顺序给树有点坑啊

需要注意的地方:

  1.偷画是要有来有回的,所以要把走廊的长度*2

  2.第一条走廊并不满足二叉结构,可以直接手动去掉

 //访问艺术馆 (Codevs No.1163)
//树状DP
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=;
const int maxt=;
int DP[maxn][maxt];
int T;
int Index=;
int val[maxn];
int lson[maxn];
int rson[maxn];
int lenlson[maxn];
int lenrson[maxn];
void Build(int now)
{
int len,num;
scanf("%d %d",&len,&num);
lson[now]=++Index;
lenlson[now]=len*;
if(num==)Build(lson[now]);
else val[lson[now]]=num;
scanf("%d %d",&len,&num);
rson[now]=++Index;
lenrson[now]=len*;
if(num==)Build(rson[now]);
else val[rson[now]]=num;
return ;
}
int DFS(int x,int time)
{
if(time<)return -;
if(DP[x][time]>-)return DP[x][time];
if(lson[x]==&&rson[x]==)
{
for(int i=val[x];i>=;i--)
{
if(time-i*>=)return DP[x][time]=i;
}
}
DP[x][time]=;
DP[x][time]=max(DP[x][time],DFS(lson[x],time-lenlson[x]));
DP[x][time]=max(DP[x][time],DFS(rson[x],time-lenrson[x]));
for(int i=lenlson[x];time-i>=lenrson[x];i++)
{
DP[x][time]=max(DP[x][time],DFS(lson[x],i-lenlson[x])+DFS(rson[x],time-i-lenrson[x]));
}
return DP[x][time];
}
int main()
{
int x,y;
scanf("%d",&T);
scanf("%d %d",&x,&y);
if(y==)
{
Build();
}
memset(DP,-,sizeof(DP));
DFS(,T-x*-);
if(T-x*->=)printf("%d",DP[][T-x*-]);
else printf("");
return ;
}

Codevs No.1163 访问艺术馆的更多相关文章

  1. codevs 1163 访问艺术馆

    1163 访问艺术馆  时间限制: 1 s  空间限制: 128000 KB       题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结 ...

  2. codevs 访问艺术馆

    /* codevs 1163 访问艺术馆 红果果的树形dp*/ #include<iostream> #include<cstdio> #include<cstring& ...

  3. codevs1163访问艺术馆(树形dp)

    1163 访问艺术馆  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备, ...

  4. 【CodeVS 1163】访问艺术馆

    http://codevs.cn/submission/2367697/ loli蜜汁(面向高一)树形dp是这道题的改编. 改编后的题目中每个展览厅的有多个不同的画,偷画的时间和画的价值也不同,求最大 ...

  5. codevs 1163:访问艺术馆

    题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精 ...

  6. 【codevs1163】访问艺术馆

    题目描述 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的 ...

  7. 【codevs1163】访问艺术馆 树形dp

    题目描述 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的 ...

  8. codevs1163访问艺术馆 树形dp

    算裸的树形dp吧 回来复习一波 #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  9. 2016. 4.10 NOI codevs 动态规划练习

    1.codevs1040 统计单词个数 1040 统计单词个数 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 De ...

随机推荐

  1. java学习笔记[2015-1-19]

    想到哪儿说到哪儿: 1.关于import,全限定名导入和按需导入(即只使用*),影响的只是编译速度,编译过后生成的是全限定名,全限定名还一个好处是不容易产生冲突 2.每个java文件只能有一个publ ...

  2. twitter bootstrap 2.x 3.x区别

    栅格系统 (Grid system)说个我认为比较重要的,相对于RC 1中的3层,现在有4层了 We now have .col-xs (phones), .col-sm (tablets), .co ...

  3. Collection_Compare

    冒泡 package com.bjsxt.sort.bubble; import java.util.Arrays; public class BubbleSort1 { /** * @param a ...

  4. objcopy

    objcopy objcopy [options] infile [outfile] Copy the contents of the input object file to another fil ...

  5. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  6. Codeforces Round #239 (Div. 2)

    做了三个题,先贴一下代码...终于涨分了 A. Line to Cashier 水题 #include <iostream> #include <cstdio> #includ ...

  7. Catalan数推导(转载)

    Raney引理: 设整数序列A = {Ai, i=1, 2, …, N},且部分和Sk=A1+…+Ak,序列中所有的数字的和SN=1,在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均 ...

  8. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  9. sql server 数据库 ' ' 附近有语法错误

    昨天做项目时候,遇到标题的问题,代码跟踪把sql 语句 复制出来在数据库执行不了, 然后重新写个一模一样的,然后在 赋值到代码中,还是同样的错误, 就是不知道哪里出现了错误,最后 把 sql 语句写成 ...

  10. bzoj3275: Number

    最小割...然后推一下可知不能的情况必定为一奇一偶,于是s->奇->偶->t.跑最小割即可. #include<cstdio> #include<cstring&g ...