BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1177
题意概括
在一个n*m的矩阵中,每一个位置一个数字。
现在让你选出3个k*k的矩阵,它们互不相交,问最大数值和为多少。
注意:n,m<=1500
题解
一开始总想着dp,发现不大可能。
暴搜也不行。
然后突然发现,很简单,情况总数非常的少。
只有以下6种,从3个区域中各选择一个最大的。

然后就很简单了,我们只需要预处理矩阵前缀和,左上左下右上右下4个方向的前缀max。
然后对于前两种,分别枚举一下列号和行号;
对于后四种,只要枚举中间点就可以了。
所以复杂度为n2。可以过去了。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=1500+5;
int n,m,k,nn,mm;
int a[N][N],sum[N][N],val[N][N],Row[N],Col[N],LU[N][N],RU[N][N],LD[N][N],RD[N][N];
int main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
memset(sum,0,sizeof sum);
memset(val,0,sizeof val);
memset(Row,0,sizeof Row);
memset(Col,0,sizeof Col);
memset(LU,0,sizeof LU);
memset(RU,0,sizeof RU);
memset(LD,0,sizeof LD);
memset(RD,0,sizeof RD);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
nn=n-k+1,mm=m-k+1;
for (int i=1;i<=nn;i++)
for (int j=1;j<=mm;j++)
val[i][j]=sum[i+k-1][j+k-1]-sum[i-1][j+k-1]-sum[i+k-1][j-1]+sum[i-1][j-1];
for (int i=1;i<=nn;i++)
for (int j=1;j<=mm;j++)
Row[i]=max(Row[i],val[i][j]),Col[j]=max(Col[j],val[i][j]);
for (int i=1;i<=nn;i++)
for (int j=1;j<=mm;j++)
LU[i][j]=max(val[i][j],max(LU[i-1][j],LU[i][j-1]));
for (int i=1;i<=nn;i++)
for (int j=mm;j>=1;j--)
RU[i][j]=max(val[i][j],max(RU[i-1][j],RU[i][j+1]));
for (int i=nn;i>=1;i--)
for (int j=1;j<=mm;j++)
LD[i][j]=max(val[i][j],max(LD[i+1][j],LD[i][j-1]));
for (int i=nn;i>=1;i--)
for (int j=mm;j>=1;j--)
RD[i][j]=max(val[i][j],max(RD[i+1][j],RD[i][j+1]));
int ans=0;
/* ---- ---- ----- ----- ----- -----
|||| |--| | | | |---| | |-| |-| |
---- |--| ----- | | | ----- -----
---- |---| ----- */
for (int i=1;i<=nn;i++){
int Max=0;
for (int j=i+k;j<=nn;j++){
Max=max(Max,Row[j]);
if (j+k>nn)
break;
ans=max(ans,LU[i][mm]+Max+LD[j+k][mm]);
}
}
for (int i=1;i<=mm;i++){
int Max=0;
for (int j=i+k;j<=mm;j++){
Max=max(Max,Col[j]);
if (j+k>mm)
break;
ans=max(ans,LU[nn][i]+Max+RU[nn][j+k]);
}
}
for (int i=k+1;i<=nn;i++)
for (int j=k+1;j<=mm;j++){
int lu=LU[i-k][j-k],ru=RU[i-k][j],ld=LD[i][j-k],rd=RD[i][j];
ans=max(ans,lu+ru+LD[i][mm]);
ans=max(ans,lu+ld+RU[nn][j]);
ans=max(ans,ld+rd+LU[i-k][mm]);
ans=max(ans,rd+ru+LU[nn][j-k]);
}
printf("%d",ans);
return 0;
}
BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值的更多相关文章
- [BZOJ1177][Apio2009]Oil
[BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...
- bzoj1177 [Apio2009]Oil 二维前缀最大值,和
[Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2300 Solved: 932[Submit][Status][Disc ...
- BZOJ1177:[APIO2009]Oil(枚举,前缀和)
Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质 ...
- C# 数组、一维数组、二维数组、多维数组、锯齿数组
C# 数组.一维数组.二维数组.多维数组.锯齿数组 一.数组: 如果需要使用同一类型的对象,就可以使用数组,数组是一种数据结构,它可以包含同一类型的多个元素.它的长度是固定的,如长度未知的情况下,请 ...
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- c#简单实现二维数组和二维数组列表List<>的转置
刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...
- saltstack自动化运维系列⑩SaltStack二次开发初探
saltstack自动化运维系列⑩SaltStack二次开发初探 1.当salt运行在公网或者网络环境较差的条件下,需要配置timeout时间vim /etc/salt/master timeout: ...
- “全栈2019”Java第三十一章:二维数组和多维数组详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- c# 一维数组,二维数组,多维数组。
数组就是给一个变量定义多个字符,可以是string也可以是int.或者说是一组变量. 可以更加方便的操作大量数据. 数组的定义1.数组里面的内容必须是同一类型2.数据必须有长度限制 一维数组 *一.数 ...
随机推荐
- linux系统--用户和用户组
一.用户和用户组的概念 用户:使用操作系统的人 用户组:具有相同系统权限的一组用户.在linux系统中可以存在多个用户组 1.1 /etc/group 这里存储当前系统中所有用户组的信息 每一行对应一 ...
- Linux 开机启动图形界面,shell界面
查看当前启动模式 # systemctl get-default 更改模式命令: systemctl set-default graphical.target由命令行模式更改为图形界面模式 syste ...
- java 多线程断点下载功能
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.Rand ...
- org.apache.phoenix.exception.PhoenixIOException: SYSTEM:CATALOG
Error: SYSTEM:CATALOG (state=08000,code=101)org.apache.phoenix.exception.PhoenixIOException: SYSTEM: ...
- Sqoop入门
1 下载地址 http://archive.cloudera.com/cdh5/cdh/5/ 版本 sqoop-1.4.6-cdh5.7.0 安装包 ...
- HTML5的学习(二)HTML5标签
3.按功能排列标签 (注:红色为HTML5不支持的,蓝色为HTML5新增的标签元素.) 3.1基本 标签 描述 HTML4 HTML5 <!--...--> 定义注释. √ √ < ...
- phantomjs 解码url
以下为部分代码: var htmlnodeInfo=(allADUrlElements.snapshotItem(i).getAttribute("href").match(/\* ...
- Html5 序列帧动画
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- Shell 中test 单中括号[] 双中括号[[]] 的区别
Shell test 单中括号[] 双中括号[[]] 的区别 在写Shell脚本的时候,经常在写条件判断语句时不知道该用[] 还是 [[]],首先我们来看他们的类别: $type [ [[ test ...
- spring mvc context-param init-param 区别
init-param:mvc 配置文件context-param spring配置文件