题目描述

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

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

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

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

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

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

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

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

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

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

输入输出格式

输入格式:

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

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

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

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

输出格式:

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

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

输入输出样例

输入样例#1:

2 3 2
1 2 3
2 3 4
1 2

输出样例#1:

5

说明

【数据范围】

对于 40%的数据,2≤n≤40,1≤m≤40。

对于 90%的数据,2≤n≤200,1≤m≤200。

对于 100%的数据,2≤n≤1000,1≤m≤1000,1≤p≤m。

/*
f[i]表示第i分钟的最大收益
枚举上一次规定机器人走了几步
与此同时枚举j 表示上次的起点是谁
巧妙的避开了比较复杂的处理
然后计算收益 实现转移
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define maxn 1010using namespace std;
int n,m,p,g[maxn][maxn],w[maxn],f[maxn];int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=n;i++)  for(int j=1;j<=m;j++)scanf("%d",&g[i][j]);for(int i=1;i<=n;i++)  scanf("%d",&w[i]);memset(f,128,sizeof(f));f[0]=0;for(int i=1;i<=m;i++)//时间for(int j=1;j<=n;j++)//到哪个点for(int k=1;k<=p;k++)//枚举步数
        {if(i-k<0)continue;int vi=0;for(int l=i-k+1,r=j;l<=i;l++,r++) vi+=g[r][l],r%=n;//r是几号马路,l是此机器人起始时间 f[i]=max(f[i],f[i-k]-w[j]+vi);}printf("%d\n",f[m]);return 0;
}

40 dp

/*
后来看别人博客上的优化 恍然大悟!
上面的tle的dp很明显慢在计算收益上
枚举k 表示上次选的走几步时 每次的一次相加的
这里可以优化掉他 直接维护总的
这样随着枚举k可以依次算出v
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define maxn 1010using namespace std;
int n,m,p,g[maxn][maxn],w[maxn],f[maxn];int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)scanf("%d",&g[i][j]);for(int i=1;i<=n;i++)  scanf("%d",&w[i]);memset(f,128,sizeof(f));f[0]=0;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)//这次的出发点
        {  int r=j-1,vi=0;//vi 表示累计的收益 if(r==0)r=n;vi+=g[r][i];//当前道路花费 for(int k=1;k<=p;k++)//枚举买机器人的时间
            {if(i-k<0)continue;f[i]=max(f[i],f[i-k]-w[r]+vi);if(r==1)r=n;else r--;//前一个工厂vi+=g[r][i-k];//O(1)计算
            }}printf("%d\n",f[m]);return 0;
}

转载于:https://www.cnblogs.com/L-Memory/p/7029338.html

P1070 道路游戏相关推荐

  1. 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)

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

  2. 洛谷P1070道路游戏题解--zhengjun

    题面传送门 思路 首先,这道题一定是个dpdpdp,因为题中说一旦机器人走到头了,就要立刻在其他任意的一个机器人工厂买. 一开始弄得fi,jf_{i,j}fi,j​是到了第iii个工厂,用了jjj个时 ...

  3. 道路游戏(洛谷 P1070)

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

  4. 洛谷 P1070 [NOIP2009 普及组] 道路游戏 题解

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

  5. 【洛谷 P1070】道路游戏 (DP)

    题目链接 这题还是很好想的,看到\(90%\)的数据点时,我就知道要用\(n^3\)的算法(最后10分就算了吧) 然后,数据水,直接暴力\(n^3\)卡过了. 显然是道DP. 设\(f[i]\)表示第 ...

  6. 计算机题目道路游戏,道路考试模拟游戏

    1 仪表显示当前车速是20公里/小时.查看本题分析 2 机动车参加安全技术检验的主要目的是检查车辆各项性能系数,及时消除车辆安全隐患,减少事故发生.查看本题分析 3 遇到这种情形时要停车避让行人.查看 ...

  7. Luogu 1070 道路游戏

    看完题面想了一会发现只会写$n^3$,愣了一会才想出了单调队列优化的做法. 90分算法: 设$f_{i, j, k}$表示第$i$分钟在第$j$座城市已经走了$k$步的最大价值,转移显然,时间复杂度$ ...

  8. 2017.4.27 道路游戏 思考记录

    这个题一开始把题读错了..而且读错三次(出这种语文题 简直毒瘤) 一开始认为成了可以一边买一边跑...结果发现是n^4 然后认为成了可以不移动结束就可以买....结果发现是n^3  于是全wa 然后认 ...

  9. 【NOIP2009PJ】道路游戏

    啊哈,现在有重温了一遍o(╥﹏╥)o 从以前的O(n2)-->现在的O(n3),感觉自己废了~ (尽管代码大幅度减少) 我们可以发现p其实只是一个限制的作用,不需要枚举啊,它是一个个走的,所以只 ...

最新文章

  1. python rjust() 方法 与 ljust()方法 的使用
  2. MySQL索引相关的数据结构和算法
  3. 2020上半年中国教育行业投融资报告
  4. Downloader Middlewares
  5. 跟着alex学习了格式化输出,最大的感受就是编程这个事,一定要自己动手去做,才能学会。看会和自己会做完全是两码事...
  6. 谈中国企业管理、中国企业管理软件为啥走错了道
  7. Linux scp连接很慢,ssh连接很慢问题分析
  8. Android 四大组件学习之ContentProvider三
  9. 数据结构之时间复杂度的计算
  10. 查询 JetsonNano I2C 的工作频率(波特率)
  11. 在已有win7系统的基础上重装win10系统
  12. Microsoft Excel 无法插入新的单元格,因为这会将非空单元格推送到工作表的末尾...的问题解决
  13. 计算机学院机考,东华大学2015年计算机学院研究生复试上机考真题.docx
  14. js取小数点后两位 方法总结
  15. java 打印当月日历_74. Java打印当月日历
  16. abp 链接本地mysql_abp vNext 使用Mysql 数据库
  17. Error:(3, 41) java: 程序包org.apache.kafka.clients.producer不存在 错误提示解决办法
  18. Watershed算法
  19. 设计模式之工厂设计模式及抽象工厂设计模式
  20. 苹果开发者账号_邓白氏编码申请过程

热门文章

  1. 提高django model效率的几个小方法
  2. python中的copy模块(浅复制和深复制)
  3. axure原型案例_AXURE原型设计:移动端搜索原型案例
  4. html日历菜鸟,菜鸟第一次发代码 -- JS日历
  5. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮
  6. 【算法】赫夫曼编码 解码 实际应用 文件的编码 解码
  7. 90-50-010-源码-hbase的rowkey设计
  8. es max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
  9. 【hadoop】ipc.Client: Retrying connect to server: xxx:8020. Already tried 37 time(s) RetryPolicy[Multi
  10. Spring解决bean之间的循环依赖(循环引用)