[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来着,后来觉得这样的行为这是不对的,万一不小心复制了老师的专利啥的,或者一些不可描述的东西,就闹大了. 虽然没有采取实际行动, ...
随机推荐
- 物流跟踪API-快递单推送
上一篇文章我们讲解了订阅服务功能.我们已经完成了如何把物流订单订阅到快递鸟,快递鸟也能接收到我们的订单信息,接下来就需要快递鸟实时的将最新的物流轨迹推送到我们服务器,我们既然要接收快递鸟的信息,就需要 ...
- HTTP&&Fiddler教程
很不错的学习资料! HTTP http://www.cnblogs.com/TankXiao/category/415412.html http://www.cnblogs.com/TankXiao/ ...
- [Jinja2]本地加载html模板
import os from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader ...
- SpringBoot Jpa 分页查询最新配置方式
这是已经被废弃的接口 Sort sort = new Sort(Sort.Direction.DESC,"bean类中字段"); //创建时间降序排序 Pageable pagea ...
- Go语言实现:【剑指offer】二叉搜索树与双向链表
该题目来源于牛客网<剑指offer>专题. 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. Go语言实现: type T ...
- c#设计模式读书博客
第一次在博客园撸博客,也是为了鞭策自己去学习进步,过年之后买了一本<C#设计模式>这是我一直很想去学习的一本书.然后用博客记录我的学习历程,并且分享给需要的人.这本书记录的设计模式有23种 ...
- Import This - The Zen of Python
The Zen of Python -- by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Si ...
- js - 面向对象 - 小案例:轮播图、随机点名、选项卡、鼠标拖拽
面向对象 对象 : (黑盒子)不了解内部结构, 知道表面的各种操作. 面向对象 : 不了解原理的情况下 会使用功能 . 面向对象是一种通用思想,并非编程中能用,任何事情都能用. 编程语言的面向对象的特 ...
- Jenkins新建节点找不到通过Java web启动代理?
参考博客:Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办? 在Jenkins中,打开“系统管理”→“管理节点”→“新建节点”页面时,“启动方式”选项没有“通过Java ...
- MySQL数据库的备份、还原、迁移
一.单库备份与还原 1.远程连接MySQL数据库 D:\mysql-5.7.14-winx64\bin>mysql -h192.168.2.201 -uroot -pcnbi2018 参数说明: ...