[APIO2009]采油区域
题目描述
Siruseri 政府决定将石油资源丰富的 Navalur 省的土地拍卖给私人承包商以 建立油井。被拍卖的整块土地为一个矩形区域,被划分为 M×N 个小块。 Siruseri 地质调查局有关于 Navalur 土地石油储量的估测数据。这些数据表示 为 M×N 个正整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由 K×K 块相连的 土地构成的正方形区域。 AoE 石油联合公司由三个承包商组成,他们想选择三块互不相交的 K×K 的 区域使得总的收益最大。 例如,假设石油储量的估计值如下:
说明
数据保证 K≤M 且 K≤N 并且至少有三个 K×K 的互不相交的正方形区域。
其 中 30%的输入数据,M, N≤ 12。所有的输入数据, M, N≤ 1500。每一小块土地的 石油储量的估计值是非负整数且≤ 500。
题解
弱化版的,可以爆搜即可。
这个是增强版,要dp
可以发现(很难想到),把这个原来的矩形选择3个k*k的正方形区域,
如果我们把大矩形分成3块,总有一种切的方法,可以使得这3个选择的k*k的正方形区域,在每个小的块内都有一块。
一共有6种方法:图片来源

其中,每个正方形在一个小块内随便动。
对于每一个1~6的情况,我们要枚举所有这种形态下的所有情况,计算出最大值,再取max
直接暴力显然不可取。
显然(难以)想到,每个块(除了5,6)都是和边界相交的。
以下所有的i,j表示k*k矩形的右下角,姑且叫代表点
所以,我们设a[i][j],b[i][j],c[i][j],d[i][j],表示,这个代表点在(i,j)左上、右上,左下,右下的所有情况中,k*k正方形最大的总和。
对于a,b,c,d我们都可以以合理的方式递推得到。
然后,再6次nm枚举6种形态的所有情况,取一个mx
注意,(i,j)是代表点的坐标,所以我们循环的边界要注意。必须留出3个正方形的空间。
画图举例想一想就很容易了。
代码:(之后统计的编号对应在图中,都加了注释)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
int s[N][N],a[N][N],b[N][N],c[N][N],d[N][N];
int ans,n,m,k;
int main(){
scanf("%d%d%d",&n,&m,&k);int t;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&t),s[i][j]=s[i-][j]+s[i][j-]-s[i-][j-]+t;
for(int i=n;i>=k;i--)
for(int j=m;j>=k;j--)
s[i][j]-=s[i-k][j]+s[i][j-k]-s[i-k][j-k];
for(int i=k;i<=n;i++)
for(int j=k;j<=m;j++)
a[i][j]=max(s[i][j],max(a[i-][j],a[i][j-]));
for(int i=k;i<=n;i++)
for(int j=m;j>=k;j--)
b[i][j]=max(s[i][j],max(b[i][j+],b[i-][j]));
for(int i=n;i>=k;i--)
for(int j=k;j<=m;j++)
c[i][j]=max(s[i][j],max(c[i][j-],c[i+][j]));
for(int i=n;i>=k;i--)
for(int j=m;j>=k;j--)
d[i][j]=max(s[i][j],max(d[i][j+],d[i+][j])); for(int i=k;i<=n-k;i++)//
for(int j=k;j<=m-k;j++)
ans=max(ans,a[i][j]+b[i][j+k]+c[i+k][m]);
for(int i=k+k;i<=n;i++)//
for(int j=k;j<=m-k;j++)
ans=max(ans,c[i][j]+d[i][j+k]+a[i-k][m]);
for(int i=k+k;i<=n-k;i++)//
for(int j=k;j<=m;j++)
ans=max(ans,s[i][j]+a[i-k][m]+c[i+k][m]);
for(int i=k;i<=n-k;i++)//
for(int j=k;j<=m-k;j++)
ans=max(ans,a[i][j]+c[i+k][j]+b[n][j+k]);
for(int i=k;i<=n-k;i++)//
for(int j=k+k;j<=m;j++)
ans=max(ans,a[n][j-k]+b[i][j]+d[i+k][j]);
for(int i=k;i<=n-k;i++)//
for(int j=k+k;j<=m-k;j++)
ans=max(ans,s[i][j]+a[n][j-k]+b[n][j+k]);
printf("%d",ans);
return ;
}
[APIO2009]采油区域的更多相关文章
- 洛谷P3625 - [APIO2009]采油区域
Portal Description 给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大. Sol ...
- [SOJ #686]抢救(2019-11-7考试)/[洛谷P3625][APIO2009]采油区域
题目大意 有一个\(n\times m\)的网格,\((x,y)\)权值为\(a_{x,y}\),要求从中选取三个不相交的\(k\times k\)的正方形使得它们权值最大.\(n,m,k\leqsl ...
- [P3625][APIO2009]采油区域 (前缀和)
这道题用二维前缀和可以做 难度还不算高,细节需要注意 调试了很久…… 主要是细节太多了 #include<bits/stdc++.h> using namespace std; #defi ...
- Luogu 3625 [APIO2009]采油区域
想了很久的dp,看了一眼题解之后感觉自己被安排了. 发现从一个矩形中选择三个不相交的正方形一共只有六种取法. 那么我们可以处理出四个值: $f_{i, j}$分别表示以$(i, j)$为右下角,左下角 ...
- bzoj1177&p3625 [APIO2009]采油区域p[大力讨论]
我好菜菜啊. 给定矩形,从中选出三个边长K的正方形互不重叠,使得覆盖到的数总和最大. 想的时候往dp上钻去了..结果一开始想了一个错的dp,像这样 /************************* ...
- 洛谷 P3625 [APIO2009]采油区域【枚举】
参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog懒得画了 bzoj蜜汁TTT ...
- Java实现 蓝桥杯VIP 算法训练 采油区域
算法训练 采油区域 时间限制:2.0s 内存限制:512.0MB 提交此题 查看参考代码 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整 ...
- Noip 训练指南
目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...
- [BZOJ1177][Apio2009]Oil
[BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...
随机推荐
- python—启动自带shell时报错(丢失api-ms-win-crt-runtime-l1-1-0.dll)已解决
备注: 有的伙伴安装完1后重启,问题可以解决,summer儿在安装完1依然未能解决,于是又进行了2的安装再次重启后问题解决!! 1,安装vc-redist.x64,微软官网搜索免费下载,安装后重启. ...
- Ubuntu系统无法识别Logitech M590蓝牙鼠标的问题
参见 - https://blog.csdn.net/yh2869/article/details/73119018 亲测可用. 系统:ubuntu 16.04 64bit 现象:鼠标配对可以成功,但 ...
- PHP中 post方法 与 get方法 的区别
1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.domain.co ...
- Java将json字符串转成map
Map<String, Object> map = (Map<String, Object>) JSONUtils.parse(result)
- 【Alpha】阶段第十次Scrum Meeting
[Alpha]阶段第十次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 登出接口 编写后端说明文档 赵智源 编写脚本实现测试的持续集成 前测试点页面跳转逻辑测试 ...
- 20162328蔡文琛 week09 大二
20162328蔡文琛 大二week09 教材学习内容总结 堆是一棵完全二叉树,其中每个元素大于等于其所有子节点的值. 向堆中添加一个元素的方法是,首先将这个元素添加为叶节点然后将其向上移动到合适的位 ...
- mybatis 原理
什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- wcf的DataContractAttribute与DataMenmberAttribute
文章:序列化和反序列化的几种方式(DataContractSerializer)(二) 介绍了序列化控制细节.哪些字段可以序列化,序列化后这些字段的名字.
- 使用Fabric自动化你的任务
Fabric是一个Python库,可以通过SSH在多个host上批量执行任务.你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行.这些功能非常适合应用的自动化部署 ...
- ini_set的权限大于error_reporting
在用php做网站开发的时候 , 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这 ...