[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 ...
随机推荐
- 论文笔记:分形网络(FractalNet: Ultra-Deep Neural Networks without Residuals)
FractalNet: Ultra-Deep Neural Networks without Residuals ICLR 2017 Gustav Larsson, Michael Maire, Gr ...
- Tomcat之初识初体验
1.what's this? Stable performance, free Java web application server! 相关: Java,Javac,JVM,JRE,JDK,Java ...
- 以符合人类阅读的方式打印php数组【转载】
在程序开发过程中:打印数据进行查看调试是非常频繁的:如果没有一种易于阅读的样式那是相当痛苦的: 先定义一个数组: 1 2 3 4 5 6 7 8 9 $array=array( 't0'=&g ...
- Javascript开发者 常用知识
Javascript是一种日益增长的语言,特别是现在ECMAScript规范按照每年的发布时间表发布.伴随着这门语言的规模化和快速发展,掌握JS(不仅仅是jQuery)的重要性,变得更加重要. 这不是 ...
- idea打断点是灰色的
点击这个图标,debug的断点就是灰色的,debug功能被禁用
- eclipse自动生成uml
见如下链接: https://blog.csdn.net/zyf_balance/article/details/44937197 若eclipse无法生成,可以安装myeclipse使用自带的方法: ...
- Task 4.5 求二维数组中的最大连通子数组之和
任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将 ...
- Leetcode题库——23.合并k个排序链表
@author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...
- 如何在IIS中设置HTTPS服务
文章:https://support.microsoft.com/en-us/help/324069/how-to-set-up-an-https-service-in-iis 在这个任务中 摘要 为 ...
- 利用CNN进行多分类的文档分类
# coding: utf-8 import tensorflow as tf class TCNNConfig(object): """CNN配置参数"&qu ...