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. css的选择器及它的种类特性?

    今天主要说的是选择器的基础, 首先看,选择器的优先级:!important > 行间样式 > id选择器 > class 选择器 == 属性选择器 > 标签选择器 > 通 ...

  2. NLP(二十)利用BERT实现文本二分类

      在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...

  3. 林大妈的JavaScript进阶知识(一):对象与内存

    JavaScript中的基本数据类型 在JS中,有6种基本数据类型: string number boolean null undefined Symbol(ES6) 除去这六种基本数据类型以外,其他 ...

  4. python学习--quote()函数

    屏蔽特殊的字符.比如如果url里面的空格!url里面是不允许出现空格的. 在 Python2.x 中的用法是:urllib.quote(text)Python3.x 中是urllib.parse.qu ...

  5. Selenium实现微博自动化运营:关注、点赞、评论

    目录 Selenium 是什么? 一.核心代码 二.步骤分解 1.打开浏览器 2.访问微博登录页 3.输入账号密码 4.点击登录 5.通过人机验证 6.打开我们的中公题库君首页 7.加一下关注 8.定 ...

  6. cookie理解与实践【实现简单登录以及自动登录功能】

    cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...

  7. Deeplab

    Deeplab系列是谷歌团队的分割网络. DeepLab V1 CNN处理图像分割的两个问题 下采样导致信息丢失 maxpool造成feature map尺寸减小,细节信息丢失. 空间不变性 所谓空间 ...

  8. uniapp单页面配置无导航栏

    { "path": "pages/login/login", "style": { "navigationStyle": ...

  9. 基于 HTML5 Canvas 的病毒模拟视觉试验台

    前言 2020 年 1 月 12 日,世界卫生组织以武汉病毒肺炎病例命名了一种病毒,2019新型冠状病毒 ( 2019-nCoV ) .随着春运的到来,该病毒迅速的蔓延开来,大家都唯恐避之不及.病毒的 ...

  10. num10---适配器模式

    1.类适配器 Adapter类,通过继承 被适配的类,实现目标类的接口,完成适配. 分析: java 单继承,所以适配器类 需要继承 被适配类,这就要求目标类必须是接口,有一定局限性. 被适配类的方法 ...