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转移方程

\[dp(i,j)=
\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] 小偷的更多相关文章

  1. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  2. [PHP知识点乱炖]四、全局变量——小偷从良记

    本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...

  3. 基于PHP的cURL快速入门教程 (小偷采集程序)

    cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数.     最爽的是,PHP也支持 cURL 库.本文将介绍 c ...

  4. 读"U盘小偷"有感

    作者: sudami 嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:http://bbs.pediy.com/showthread.php?p=381656#p ...

  5. 锻造完美U盘小偷:活用消息机制

    锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...

  6. PHP的cURL快速入门 (小偷采集程序)

    cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数.   最爽的是,PHP也支持 cURL 库.本文将介绍 cUR ...

  7. C#网页单页小偷源码

    这个软件是因为工作需要(偷模版哈哈)而专门对这个网站(cainiaoapp.cn)定制开发的单页小偷软件,因为仅仅是满足我个人的使用需求,没完善,比如CSS里面的图片不会判断下载,只下载http:// ...

  8. 我对java的理解(二)——反射是小偷的万能钥匙

    在我们生活中,车上或者路上有时候会遇到一种很讨厌的人——“小偷”,趁我们不注意或者疏忽的时候拿走属于我们的东西.更有甚者,趁我们不在家的时候,手持一把万能钥匙,打开我们的房门,悠闲的查看房间的布置,翻 ...

  9. U盘小偷——C++实现U盘插入检测和文件扫描拷贝

    前几天女朋友说老师上课的PPT不共享,没法复习,想着写个U盘小偷拷贝PPT来着,后来觉得这样的行为这是不对的,万一不小心复制了老师的专利啥的,或者一些不可描述的东西,就闹大了. 虽然没有采取实际行动, ...

随机推荐

  1. 如何利用开源解码项目开发js视频解码的web应用 系列

    介绍web上开发视频业务相关程序的技术演变历程 https://www.cnblogs.com/maoliangwu/articles/12046495.html 介绍ffmpeg asm.js we ...

  2. 2019ccpc哈尔滨打铜记

    小学生日记: 2019.10.13,哈尔滨,打了个铜 开头 先说结论,这次失败,我的锅70%,sdl的锅5%,ykh25% Day0 周五, 我们队出现了奇怪的厄运上身 首先是我中途在飞机上数据线突然 ...

  3. NFA和DFA的区别

      NFA DFA 初始状态 不唯一 唯一 弧上的标记 字(单字符字/ε) 字符(串) 转换关系 非确定 确定 对于每个NFA M都存在一个DFA M' 使得 L(M) = L(M')

  4. 1. 学习Linux操作系统

    1.熟练使用Linux命令行(鸟哥的Linux私房菜.Linux系统管理技术手册) 2.学会Linux程序设计(UNIX环境高级编程) 3.了解Linux内核机制(深入理解LINUX内核) 4.阅读L ...

  5. ssh连接超时的问题

    vi /etc/ssh/sshd_config ClientAliveInterval ClientAliveCountMax # 注: # ClientAliveInterval选项定义了每隔多少秒 ...

  6. [redis读书笔记] 第一部分 数据结构与对象 压缩列表

    压缩列表是为了节省内存而设计的,是列表键和哈希键的底层实现之一. 压缩列表的逻辑如下,

  7. Redis中RDB和AOF持久化区别和联系

    RDB和AOF持久化   ​RDB持久化 RDB是什么? 原理是redis会单独创建(fork) 一个与当前进程一模一 样的子进程来进行持久化,这个子进程的所有数据(变量.环境变量,程序程序计数器等) ...

  8. golang搭建一个简单的web服务器

    package main import ( "io/ioutil" "log" "net/http" ) func main() { htt ...

  9. 一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    1.MySQL逻辑架构 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  10. TCP加速方式

    使用windows scaling TCP Extensions for High Performance, RFC1323,https://www.ietf.org/rfc/rfc1323.txt ...