[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 os.walk详解
os模块大全详情 os.walkos.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks ...
- 实践lnmpde 的安装
1.先安装apache, yum install httpd 2.安装MySQL rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 ...
- Redux和React-Redux的实现(三):中间件的原理和applyMiddleware、Thunk的实现
现在我们的Redux和React-Redux已经基本实现了,在Redux中,触发一个action,reducer立即就能算出相应的state,如果我要过一会才让reducer计算state呢怎么办?也 ...
- 2017年第八届蓝桥杯【C++省赛B组】
1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有 ...
- 作业MathExam
MathExam233 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 600 650 • ...
- 06慕课网《进击Node.js基础(一)》作用域和上下文
作用域 function(){}大括号中的内容是一个作用域; function 和 var 的声明会被提到作用域的最上面 function f(){ a = 2; var b = g(); //此处可 ...
- tcp/ip客户端与服务器
单击“发送数据”把数据发送到指定IP地址的指定端口号 using System; using System.Collections.Generic; using System.ComponentMod ...
- gogoing软件NABCD
N,need 需求:gogoing项目目前打算做得是一个基于石家庄铁道大学在校大学生对于短期节假日出行旅游的指南.最关键的定义为“穷游”.“穷”则体现在以小的花销去实现最完美的旅游方式.我们的gogo ...
- eclipse 项目转as项目时 .so文件 jniLibs的设置
接着上篇:http://blog.csdn.net/u011644423/article/details/46989167 转换项目 还是出现了问题 java.lang.UnsatisfiedLink ...
- Linux下CPU信息的查看
逻辑CPU个数: cat /proc/cpuinfo | grep "processor" | wc -l //32 物理CPU个数: cat /proc/cpuinfo ...