传送门

Description

黄金矿工是一个经典的小游戏,它可以锻炼人的反应能力。该游戏中,可以通过“挖矿”获得积分并不断升级。玩家可以在线玩flash版黄金矿工,也可以下载后玩单机版黄金矿工。目前,黄金矿工小游戏有多个版本,例如黄金矿工双人版,黄金矿工单人版等。

Jimmy是一位黄金矿工,他所在的金矿是一个n*n的矩形区域(俯视),区域内有黄金、石头和TNT,由一个 n*n的矩阵描述。黄金的价值对应矩阵中的正值,石头的价值对应矩阵中的负值,TNT由0表示。换句话说,挖到黄金赚钱,石头亏损,如果挖到TNT就挂了。

Jimmy租到的挖矿工具很特别,它的形状是一个长宽任意(均为正整数)的矩形,可以取走被该工具覆盖的矩形区域内的所有物品,但如果该区域内有TNT,该工具将被炸毁,此时Jimmy将不得不赔偿矿主+∞元!!!需要注意的是,该工具只能在金矿范围内使用(即不得超出金矿边界),且租金为每次使用十元。

现在,Jimmy想知道,如果他至多只有一次租用该工具的机会,他能获得的最大收益是多少。当然,如果Jimmy租用该工具无论如何都会亏损,他可以不租用,此时收益为0.

Input

第一行:一个整数n
接下来n行,每行n个整数(绝对值<100),为题目中所描述的矩阵。

Output

一个数,即Jimmy所能获得的最大收益。

Sample Input

3
0 -1 -1
0 -12 0
-19 0 0

Sample Output

0

Hint

【样例解释】
无论Jimmy怎么挖矿,挖到的不是石头,就是TNT,总之无论如何都会亏损,所以选择不租用工具,收益为0

【数据范围】
对于30%的数据:0<n<=10
对于60%的数据:0<n<=100
对于100%的数据:0<n<=300

Source

动态规划, 贪心,子矩阵DP

这是一道很好的DP题,首先这道题的模型就是求最大子矩阵和。很容易想到的暴力枚举是O(n^4)的,显然会TLE,我们发现,暴力枚举的时候我们很多东西都重复计算了,没有很好的利用中间结果。

首先从一维的子序列最大和讲起。对于任意数列,O(n)的求它最大的子序列和,设f[i]表示到i位置的最大和,那么状态的转移只有两种,如果f[i-1]>0,那么 f[i]=f[i-1]+a[i],否则f[i]=a[i]。因为要求最大的子序列和,所以所选的子序列的起始位置一定是正数。

当f[i]>0时,这个转移显然是对的,(每次转移后都会更新答案,所以a[i]<0也不会影响答案)

当f[i-1]<0时,f[i-1]+a[i]一定小于 a[i],而i-1是从上一个起始位置开始,一段子序列中和第一次小于0的位置,同时序列的起点又是正数,所以上一次选的序列中不存在一个位置到当前位置的序列和大于0,所以新序列从 i 位置开始。

然后类比到二维的子矩阵和,我们可以把一个矩形一列的和看做一维数组的一个元素,转化为上面那个问题,这样就只需枚举矩形的上下界,求和的话可以用前缀和优化,记录每一列的前缀和,这样就可以O(1)求矩形一列的和。总复杂度为O(n^3)。

还可以参见这篇博客,博主讲得很清楚。

 1 #include <map>
 2 #include <set>
 3 #include <cmath>
 4 #include <ctime>
 5 #include <queue>
 6 #include <stack>
 7 #include <cstdio>
 8 #include <string>
 9 #include <vector>
10 #include <cstdlib>
11 #include <cstring>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 #define ll long long
16
17 inline int gi()
18 {
19     bool b=0; int r=0; char c=getchar();
20     while(c<'0' || c>'9') { if(c=='-') b=!b; c=getchar(); }
21     while(c>='0' && c<='9') { r=r*10+c-'0'; c=getchar(); }
22     if(b) return -r; return r;
23 }
24
25 const int inf = 21400000, N = 307;
26 int a[N][N];
27
28 int main()
29 {
30     int i,j,k,sum,ans,n;
31     n=gi();
32     for (i=1; i<=n; i++)
33         for (j=1; j<=n; j++)
34             {
35                 a[i][j]=gi();
36                 if (!a[i][j]) a[i][j]=-inf;
37                 a[i][j]+=a[i-1][j];  //记录每一列的前缀和
38             }
39     for (i=1; i<=n; i++)  //枚举子矩形下面边的位置
40         for (k=0; k<i; k++)  //枚举子矩形上面边的位置
41             {
42                 sum=0;
43                 for (j=1; j<=n; j++)  //枚举矩形的宽 若 sum 大于 0 则继续扩展 每次更新 ans 否则 sum=0 重新枚举一个子矩形 妙不可言
44                     {
45                         sum+=a[i][j]-a[k][j];
46                         if (sum < 0) sum=0;
47                         else ans=max(ans,sum);
48                     }
49             }
50     printf("%d\n",max(ans-10,0));
51     return 0;
52 }

转载于:https://www.cnblogs.com/y142857/p/7152992.html

[Tyvj Aug11] 黄金矿工相关推荐

  1. 黄金矿工游戏demo

    试玩地址:  http://www.adanghome.com/js_demo/13/ 请使用chrome.firefox或safari.ie的话,请大于ie8. 按空格键扔出钩子,按左右键控制矿工移 ...

  2. 2018级C语言大作业 - 黄金矿工

    黄金矿工 C语言作业 分享18级同学大一上学期用C语言实现的黄金矿工.分步骤代码.图片音乐素材.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1xCy1l2-7Q ...

  3. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  4. 你的记忆里有黄金矿工吗?

    黄金矿工是大概是我初中时候玩的游戏吧,记忆中的样子是一群人围在一个电脑傍边,两人一组,输了就换下一组,虽然它不上现在游戏的丰富的游戏内容.但是就是让人欲罢不能,成为一款经典! Java游戏项目黄金矿工 ...

  5. 项目二 黄金矿工 1

    黄金矿工 第一部分 1 绘制窗口 2 背景绘制 3 红线绘制 4 线的延长和收回 6 金块绘制 7 闪动问题解决 8 抓取判定与返回 9 添加多个金块 10 解决金块消失的bug 11 创建石块类 第 ...

  6. Java练手小游戏---黄金矿工

    你玩过4399曾经最火的黄金矿工小游戏吗,黄金矿工小游戏是一款休闲娱乐的一个挖宝游戏,在游戏中地下会有许多的宝藏,你得想办法把它们都挖出来,作为矿工的你,对你来说是轻车熟路的,能不能挖到宝,看你抓取的 ...

  7. 【小游戏】2D游戏黄金矿工GoldMiner(关卡模式)

    难度系数: ★★★☆☆ 游戏玩法: 黄金矿工,在恰当的时机点击屏幕放出钩子捡金块 项目简介: 功能完善,关卡模式,适合初中级练手学习 本文内容: 简单记录一下主要代码逻辑 转向机钩子的逻辑设定 1.钩 ...

  8. LeetCode:1219.黄金矿工(Java语言)

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 1219.黄金矿工 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 ...

  9. 洛谷P3961 [TJOI2013]黄金矿工—C++

    题目 题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在 ...

最新文章

  1. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml
  2. insightface mxnet训练 out of Memory
  3. 全国计算机等级考试三级历年真题,历年全国计算机等级考试三级(数据库技术)笔试选择真题...
  4. Maven 的相关配置【源码下载、镜像源修改】
  5. SQLServer附加数据库提示“版本为661,无法打开,支持655版本……”
  6. 快速搞懂 SQL Server 的锁定和阻塞
  7. 全国计算机等级考试题库二级C操作题100套(第26套)
  8. 视觉SLAM笔记(58) 字典
  9. java调用自身_Java有趣的自己调用自己
  10. 微信小程序开发的完整人性化版攻略
  11. react ssr 简单实现
  12. java中操作docker
  13. 润乾统计图超链接使用例子
  14. ssh连接openwrt_如何将SSH无密码连接到OpenWrt路由器?
  15. RabbitMQ 实战教程
  16. 【数据结构与算法】五、哈希表和链表
  17. web前端:img标签alt属性什么情况留空?
  18. 机器学习——基础知识
  19. 敏捷框架SAFe(Scaled Agile Framework)实践
  20. css实现文字大小自适应

热门文章

  1. ARM学习之GPIO实现流水灯
  2. webstorm 怎样设置默认浏览器为Google谷歌浏览器?怎样在Google谷歌浏览器中打开网页?
  3. 平行坐标系 matlab,ECharts平行坐标系(parallel)
  4. H264 编码基本原理
  5. java统计出现频率高的数据_统计一个文本中出现频率最高的10个词
  6. 2022年自考专业考试(计算机应用)微型计算机及接口技术练习题
  7. 手机 android 系统 升级失败,谷歌再次放出大招!让安卓11系统从此不再变砖:强制无缝升级系统...
  8. 服务器端口如何修改默认端口,修改服务器的默认远程端口
  9. 表或视图不存在 紧接着line 起自MY_LINK
  10. 基于JavaWeb的网站图片爬虫系统