[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 ...
随机推荐
- 利用saltstack一键部署多台zookeeper
以上是saltstack上面sls文件存放zookeeper的路径和文件 以上是入口文件把文件夹做成包 重要安装配置在zoo.sls,以下是该sls的内容 zookeeper: file.manage ...
- Spark概述及集群部署
Spark概述 什么是Spark (官网:http://spark.apache.org) Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010 ...
- bg,fg,job命令详解
基础命令学习目录首页 原文链接:http://www.cnblogs.com/chjbbs/p/6307333.html linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务 假如你发现前 ...
- 关于MySql8.X设置允许root远程登陆的问题
这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...
- react-native 常规操作
1. 关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7
- 自制session
原理 1.面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 2.Tornado框架中,默认执行Handler的get/pos ...
- (第二周)scrum站立会议
敏捷流程scrum中的很重要的一个制度之一每日站立会议 了解的内容: 问题:为啥不用email汇报代替每日会议? E-mail不能取代每日会议,E-mail只会增加沟通成本,而且不能提供细节信息或者给 ...
- TeamWork#1,Week 5,Suggestions for Team Project
我们团队联系到了我们六班的直系学长,并向他咨询了软件工程基础这门课的团队项目相关的问题.他们团队的名字命名为Z-XML,团队中的几个学长也都是我平时所熟识的.虽然学长已经大四,忙着考研工作等各种事务, ...
- 第二阶段Sprint冲刺会议2
进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写.
- Hibernate连接数据库一直报NullPointerException
原来是少了这个.. //private HibernateTemplate hibernateTemplate; //少了下面 public HibernateTemplate getHibernat ...