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. 开源入侵检测系统OSSEC搭建之三:Web界面安装

    注意:以下操作需在OSSEC服务端进行设置 一.下载analogi,存放于/var/www/html/下并赋予权限 [root@localhost ~]# wget https://github.co ...

  2. Bitmap 和Drawable 的区别

    Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...

  3. string.length()与-1比较为什么会出现匪夷所思的结果

    今天调试程序发现了个匪夷所思的事情,-1与string.length()比较永远是-1大,看下面代码 #include<iostream> #include<string> u ...

  4. JS创建类以及类的方法(StringBuffeer类)

    创建StringBuffer类以及toString,append()方法 //创建一个StringBuffer类 ,此类有两个方法:一个是append方法一个是toString方法 function ...

  5. 宏HASH_SEARCH

    /********************************************************************//** Looks for a struct in a ha ...

  6. Akka的Actor模型及使用实例

    本文的绝大部分内容转载自rerun.me这一blog,老外写的东西就是好啊. ACTORS介绍 Anyone who has done multithreading in the past won't ...

  7. ti processor sdk linux am335x evm /bin/setup-tftp.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-tftp.sh hacking # 说明: # 本文主要对TI的sdk中的setu ...

  8. python - os.path,路径相关操作

    python处理系统路径的相关操作: # -*- coding: utf-8 -*- import os # 属性 print '__file__: %s' % __file__ # 绝对路径(包含文 ...

  9. Java [Leetcode 111]Minimum Depth of Binary Tree

    题目描述: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along th ...

  10. operator.itemgetter的用法【转】

    operator.itemgetter函数 operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [,, ...