题目描述

小新正在玩一个简单的电脑游戏。

游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接。小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编号为1-n1−n,因为马路是环形的,所以第nn 个机器人工厂和第11个机器人工厂是由一段马路连接在一起的。小新将连接机器人工厂的这 n 段马路也编号为 1-n1−n,并规定第ii段马路连接第 i 个机器人工厂和第 i+1i+1 个机器人工厂(1≤i≤n-11≤i≤n−1),第 nn 段马路连接第 nn 个机器人工厂和第11个机器人工厂。

游戏过程中,每个单位时间内,每段马路上都会出现一些金币,金币的数量会随着时间发生变化,即不同单位时间内同一段马路上出现的金币数量可能是不同的。小新需要机器人的帮助才能收集到马路上的金币。所需的机器人必须在机器人工厂用一些金币来购买,机器人一旦被购买,便会沿着环形马路按顺时针方向一直行走,在每个单位时间内行走一次,即从当前所在的机器人工厂到达相邻的下一个机器人工厂,并将经过的马路上的所有金币收集给小新,例如,小新在ii(1≤i≤n1≤i≤n)号机器人工厂购买了一个机器人,这个机器人会从 ii 号机器人工厂开始,顺时针在马路上行走,第一次行走会经过ii号马路,到达 i+1i+1号机器人工厂(如果 i=ni=n,机器人会到达第11 个机器人工厂),并将ii 号马路上的所有金币收集给小新。 游戏中,环形马路上不能同时存在22个或者 22个以上的机器人,并且每个机器人最多能够在环形马路上行走pp次。小新购买机器人的同时,需要给这个机器人设定行走次数,行走次数可以为 1~p1 p 之间的任意整数。当马路上的机器人行走完规定的次数之后会自动消失,小新必须立刻在任意一个机器人工厂中购买一个新的机器人,并给新的机器人设定新的行走次数。

以下是游戏的一些补充说明:

  1. 游戏从小新第一次购买机器人开始计时。

  2. 购买机器人和设定机器人的行走次数是瞬间完成的,不需要花费时间。

  3. 购买机器人和机器人行走是两个独立的过程,机器人行走时不能购买机器人,购买完机器人并且设定机器人行走次数之后机器人才能行走。

  4. 在同一个机器人工厂购买机器人的花费是相同的,但是在不同机器人工厂购买机器人的花费不一定相同。

  5. 购买机器人花费的金币,在游戏结束时再从小新收集的金币中扣除,所以在游戏过程中小新不用担心因金币不足,无法购买机器人而导致游戏无法进行。也因为如此,游戏结束后,收集的金币数量可能为负。

现在已知每段马路上每个单位时间内出现的金币数量和在每个机器人工厂购买机器人需要的花费,请你告诉小新,经过 mm 个单位时间后,扣除购买机器人的花费,小新最多能收集到多少金币。

输入格式:

第一行 33 个正整数n,m,pn,m,p,意义如题目所述。

接下来的nn行,每行有 mm 个正整数,每两个整数之间用一个空格隔开,其中第 i 行描

述了 ii 号马路上每个单位时间内出现的金币数量(1≤1≤金币数量≤100≤100),即第 ii行的第 jj(1≤j≤m1≤j≤m)个数表示第 jj 个单位时间内 i 号马路上出现的金币数量。

最后一行,有 nn 个整数,每两个整数之间用一个空格隔开,其中第ii 个数表示在ii号机器人工厂购买机器人需要花费的金币数量(1≤1≤金币数量≤100≤100)。

输出格式:

共一行,包含11个整数,表示在mm 个单位时间内,扣除购买机器人

花费的金币之后,小新最多能收集到多少金币。


emmmmm, 一个超级长的题面~~~

首先想到一个(n * m * p)的暴力, 用f[i]数组表示第i时所能收集的最大金币数, 最外层循环m的时间点, 中间是1 - n, 即每一个起点, 最后循环0 - p - 1,比较最大值; 嗯,时间大概为1e9 ,提交, 哎? A掉了,数据过水,啦啦啦~~

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 5e5 + ;
const int MAXM = 3e3 + ; template < typename T > inline void read(T &x) {
x = ; T ff = , ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') ff = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + (ch ^ );
ch = getchar();
}
x *= ff;
} template < typename T > inline void write(T x) {
if(x < ) putchar('-'), x = -x;
if(x > ) write(x / );
putchar(x % + '');
} int n, m, p, f[MAXN], cost[MAXN], a[MAXM][MAXM]; int main() {
read(n); read(m); read(p);
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
read(a[i][j]);
for(int i = ; i <= n; ++i)
read(cost[i]);
memset(f, -0x3f, sizeof(f));
f[] = ;
for(int i = ; i <= m; ++i) {
for(int j = ; j <= n; ++j) {
int ans = -cost[j] + f[i - ];
for(int k = ; k < p && i + k <= m; ++k) {
int q = j + k;
if(q > n) q %= n;
ans += a[q][i + k];
f[i + k] = max(ans, f[i + k]);
}
}
}
write(f[m]);
return ;
}

洛谷 P1070 道路游戏(noip 2009 普及组 第四题)的更多相关文章

  1. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  2. 洛谷 P1070 道路游戏 解题报告

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...

  3. 洛谷P1070 道路游戏

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将 ...

  4. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  5. 洛谷 P1070 道路游戏 DP

    P1070 道路游戏 题意: 有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购 ...

  6. 洛谷P1070 道路游戏(dp+优先队列优化)

    题目链接:传送门 题目大意: 有N条相连的环形道路.在1-M的时间内每条路上都会出现不同数量的金币(j时刻i工厂出现的金币数量为val[i][j]).每条路的起点处都有一个工厂,总共N个. 可以从任意 ...

  7. 洛谷 P1070 道路游戏

    设为第i秒获得的最大值 表示从当前世界是j,从pos走k步到当前点i的最大价值 注意这里的sum可以利用前面的值逐步累加. 我开始做的时候没有想到这一点单独求,然后就超时了. 同时要注意循环的循序问题 ...

  8. 最优贸易 NOIP 2009 提高组 第三题

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

  9. NOIP2015普及组第四题推销员

    好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...

随机推荐

  1. 关于NIO编程

    NIO概述 什么是NIO? Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Ja ...

  2. Dubbo之生产者

    环境步骤: 安装Zookeepr启动 创建Maven项目搭建生产者和消费者 安装DubboAdmin平台,实现监控 Dubbo注册中心采用的是Zookeeper.为什么采用Zookeeper呢? Zo ...

  3. CSS+HTML+JQuery简单菜单

    1. [代码]style <style type="text/css">    body,ul,li,a{        margin:0;        paddin ...

  4. Redis高可用部署及监控

    Redis高可用部署及监控 目录                        一.Redis Sentinel简介 二.硬件需求 三.拓扑结构 .单M-S结构 .双M-S结构 .优劣对比 四.配置部 ...

  5. linux 下errno各个值的意义(转) errno.h

    strerror(errno):获取errno对应的错误 查看错误代码errno是调试程序的一个重要方法.当linux C api函数发生异常时,一般会将errno变量(需include errno. ...

  6. Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

    QT中有九种容器组件,分别是组合框QGroupBox.滚动区QScrollArea.工具箱QToolBox.选项卡QTabWidget.控件栈QWidgetStack.框架QFrame.组件QWidg ...

  7. HTML5设计原理

    HTML5是Web标准的巨大飞跃,它为什么要包含那些东西,它背后的设计原则是什么? <JavaScript DOM编程艺术>和<HTML5 For Web Designer>作 ...

  8. Codeplus2017 11月赛T3——基因

    题目:https://www.luogu.org/problemnew/show/P4059 DP,状态应分为空格或字母,可用0和1表示,据此转移,详见代码. 另:注意初始化,因为有负值所以要先把f数 ...

  9. 如何为现有控件的DependencyProperty添加Value Changed事件?

              主要是利用DependencyPropertyDescriptor 的AddValueChanged 方法, 比如下面的例子为DataGridColumn的VisibilityPr ...

  10. ELK安装配置简单使用

    ELK是三款软件的总称,包括了elasticsearch.logstash.kibana,其实在生产使用中,我们还需要使用到其他的更多辅助软件来更好更合理的收集展示数据. Elasticsearch: ...