[TJOI2008] 小偷
TJOI2008小偷
题目背景
一位著名的小偷进入了一个充满宝石的储藏室,这个储藏室是由一连串房间构成的,房间的标号从0开始,想进入第i个房间就必须从第i-1个房间进入,如图:
题目描述
上图为三个房间的情况,黑色的部分为连通两个房间的门,从左向右的编号分别为0,1,2…。已知当小偷从第0个门进入储藏室时,储藏室的计时系统开始计时,每个门都有自己的关闭时间。每个屋里有不同种类的宝石,对于每种宝石,它的价值和小偷拿走它所耗费的时间也是不同的,为了简化问题,我们设想小偷在各个屋子之间走动的时间可以忽略不计,而且所有屋子里各种宝石的数量都是无限多的,那么请问小偷在能成功逃出来的情况下,可能获得宝石的最大价值。
附: 对于每扇门,小偷都必须在严格早于此门关闭的时候出来才可以。
输入格式
每组测试数据的第一行有两个整数N和M,分别代表储藏室有N个房间,并且有M种宝石。第二行中会有N个正整数,分别表示第i个门关闭的时间(门的编号从0开始),接下来的M行,每行有三个整数r,v和t,分别代表这种宝石所在的房间编号为r,它的价值为v,小偷拿走它所耗费的时间为t。
输出格式
输出小偷在成功逃出储藏室的情况下获得宝石的最大价值。
输入 #1
3 4
9 5 5
0 1 2
1 2 2
2 3 2
2 5 3
输出 #1
8
样例说明
我们知道,小偷应该在2时刻拿个3的,再在4时刻拿3的最后逃出到房间一,最后在一房间拿两个1的宝石,在八秒时逃出。
我们在求解时用到了两个变量一个是时间,一个是在的屋子。所以我们考虑,以这两个为变量,造一个函数。
分析算法
我们在每个房间里会有一些宝石,小偷的时间是一定的,宝石可以无限拿,他却让我们输出一个最大值,我们想到了dp。
我们不要被小偷从一号门进去而迷惑,小偷的神行无影,我们理解为小偷出生在最里面的第n间屋子里,在从外面跑,有点类似于纪念品那个题,当然在分析上会难很多。
我们的每一个门,会有自己关门的时间,对吧这就是体积v,每一个宝石就是商品,不要忘了要对关门的时间进行处理
于是乎,套上我的完全背包的模板,就有了1版的代码
定义
\(dp(i,j)\)表示在第从n到i个房间里,在j的时间内所能拿到的最贵价值
所求
\(dp(1,close[1]-1)\)即为所求我们将第\(1 到 i\)个门中关闭的的最小时间
dp转移方程
\begin{cases}
f(i+1,j)\\
f(i,j-1)\\
f(i,j-sto[i].tim[k])+sto[i].pri[k];
\end{cases}
\]
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
const int Maxdoor=55,Maxthi=110,Maxtime=1100;
struct Node{
int pri[Maxthi],tim[Maxthi],num;
}sto[Maxdoor];
int n,m,x,min1,close[Maxdoor],dp[Maxthi][Maxtime];
int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch<='9'&&ch>='0'){
x=(x<<1)+(x<<3)+(ch-'0');
ch=getchar();
}
return x;
}
void read_in(){
n=read();m=read();min1=0x3f3f3f3f;
for(int i=1;i<=n;i++){
close[i]=read();
min1=min(min1,close[i]);
close[i]=min(min1,close[i]);
}
for(int i=1;i<=m;i++){
x=read();
x++;
sto[x].num++;
sto[x].pri[sto[x].num]=read();
sto[x].tim[sto[x].num]=read();
}
return;
}
void f(){
for(int i=n;i>=1;i--){
for(int j=1;j<close[i];j++){
dp[i][j]=max(dp[i][j-1],dp[i+1][j-1]);
for(int k=1;k<=sto[i].num;k++){
if(j-sto[i].tim[k]>=0) dp[i][j]=max(dp[i][j],dp[i][j-sto[i].tim[k]]+sto[i].pri[k]);
}
}
}
printf("%d",dp[1][close[1]-1]);
}
int main() {
freopen("1.in","r",stdin);
read_in();
f();
return 0;
}
再经过考虑,我们可以直接降维,因为我们在求\(dp(i,j)\)的时候,只用到了\(dp(i+1)\)和之前的\(dp(i)\),所以我们可以降维
void f(){
for(int i=n;i>=1;i--){
for(int j=1;j<close[i];j++){
dp[j]=max(dp[j],dp[j-1]);
for(int k=1;k<=sto[i].num;k++){
if(j-sto[i].tim[k]>=0) dp[j]=max(dp[j],dp[j-sto[i].tim[k]]+sto[i].pri[k]);
}
}
}
printf("%d",dp[close[1]-1]);
}
其实最开始我们想到代码的第4行为什么要传递最优值给下一个的,但是,连续提交的50pts,让我改了下样例就发现问题了,还是菜呀,因为决策里可以这一秒什么也不干呀,而且,主要原因还是背包体积的变化
[TJOI2008] 小偷的更多相关文章
- iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】
投诉公司: 北京直信创邺数码科技有限公司 标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...
- [PHP知识点乱炖]四、全局变量——小偷从良记
本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...
- 基于PHP的cURL快速入门教程 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 c ...
- 读"U盘小偷"有感
作者: sudami 嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:http://bbs.pediy.com/showthread.php?p=381656#p ...
- 锻造完美U盘小偷:活用消息机制
锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...
- PHP的cURL快速入门 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 cUR ...
- C#网页单页小偷源码
这个软件是因为工作需要(偷模版哈哈)而专门对这个网站(cainiaoapp.cn)定制开发的单页小偷软件,因为仅仅是满足我个人的使用需求,没完善,比如CSS里面的图片不会判断下载,只下载http:// ...
- 我对java的理解(二)——反射是小偷的万能钥匙
在我们生活中,车上或者路上有时候会遇到一种很讨厌的人——“小偷”,趁我们不注意或者疏忽的时候拿走属于我们的东西.更有甚者,趁我们不在家的时候,手持一把万能钥匙,打开我们的房门,悠闲的查看房间的布置,翻 ...
- U盘小偷——C++实现U盘插入检测和文件扫描拷贝
前几天女朋友说老师上课的PPT不共享,没法复习,想着写个U盘小偷拷贝PPT来着,后来觉得这样的行为这是不对的,万一不小心复制了老师的专利啥的,或者一些不可描述的东西,就闹大了. 虽然没有采取实际行动, ...
随机推荐
- HDU_1495_模拟
http://acm.split.hdu.edu.cn/showproblem.php?pid=1495 自己用模拟写的,先除以三个数的最大公约数,弱可乐为奇数,则无解,然后开始模拟. 利用大杯子和小 ...
- 小白学 Python 数据分析(3):Pandas (二)数据结构 Series
在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...
- Python原来这么好学-1.2节: 在Linux中安装python
这是一本教同学们彻底学通Python的高质量学习教程,认真地学习每一章节的内容,每天只需学好一节,帮助你成为一名卓越的Python程序员: 本教程面向的是零编程基础的同学,非科班人士,以及有一定编程水 ...
- python学习(2)关于字符编码
关于字符编码的学习内容笔记如下: 1.计算机只能用0和1来进行记录和存储.计算机是二进制. 2.ASCII(American Standard Code for Information Interch ...
- Flink系统之Table API 和 SQL
Flink提供了像表一样处理的API和像执行SQL语句一样把结果集进行执行.这样很方便的让大家进行数据处理了.比如执行一些查询,在无界数据和批处理的任务上,然后将这些按一定的格式进行输出,很方便的让大 ...
- javascript 原生js对html元素的 增删改查 操作
'use strict'; class View{ constructor(){ } //创建html元素 addEl(fel, elemName, id, cls){ //创建一个元素 let el ...
- Language Model
在某次会上的语言模型的ppt.
- php 安装扩展插件实例-ftp.so
工作记录一下 1.首先进入原始php包安装文件(不是安装后的文件,是下载php安装压缩包,解压后的那个文件)安装包里有个扩展文件夹ext,进入 #cd /home/php-5.3.3/ext/#l ...
- Tomcat 配置2 tomcat-users.xml
Tomcat的配置 Tomcat的主要配置文件有3个,分别是: Tomcat-users.xml. web.xml server.xml. 配置Tomcat-users.xml 该文 ...
- make: *** No targets specified and no makefile found. Stop.错误
# make make: *** No targets specified and no makefile found. Stop. # yum install gcc gcc-c++ gcc-g77 ...