欢迎访问~原文出处——博客园-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 二维前缀和 二维前缀最值的更多相关文章

  1. [BZOJ1177][Apio2009]Oil

    [BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...

  2. bzoj1177 [Apio2009]Oil 二维前缀最大值,和

    [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2300  Solved: 932[Submit][Status][Disc ...

  3. BZOJ1177:[APIO2009]Oil(枚举,前缀和)

    Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质 ...

  4. C# 数组、一维数组、二维数组、多维数组、锯齿数组

    C#  数组.一维数组.二维数组.多维数组.锯齿数组 一.数组: 如果需要使用同一类型的对象,就可以使用数组,数组是一种数据结构,它可以包含同一类型的多个元素.它的长度是固定的,如长度未知的情况下,请 ...

  5. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  6. c#简单实现二维数组和二维数组列表List&lt;&gt;的转置

    刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...

  7. saltstack自动化运维系列⑩SaltStack二次开发初探

    saltstack自动化运维系列⑩SaltStack二次开发初探 1.当salt运行在公网或者网络环境较差的条件下,需要配置timeout时间vim /etc/salt/master timeout: ...

  8. “全栈2019”Java第三十一章:二维数组和多维数组详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. c# 一维数组,二维数组,多维数组。

    数组就是给一个变量定义多个字符,可以是string也可以是int.或者说是一组变量. 可以更加方便的操作大量数据. 数组的定义1.数组里面的内容必须是同一类型2.数据必须有长度限制 一维数组 *一.数 ...

随机推荐

  1. node之常用模块

    http express cheerio superagent url events fs util querystring request

  2. DBeaver入门

    1 安装好连接好数据库,查询操作 注意黄色字体1 2 3 4 执行sql操作

  3. k8s系列~mgr的应用

    一  简介:今天咱们大体介绍下 这两者是如何联系的二  概念解析     pod:说下我的理解    1 pod通过yaml文件来封装docker本身+启动形式    2 pod可以运行多个docke ...

  4. Executor线程池的简单使用

    我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...

  5. shiroWeb项目-认证及MD5认证信息在页面显示(十)

    realm设置完整认证信息 // realm的认证方法,从数据库查询用户信息 @Override protected AuthenticationInfo doGetAuthenticationInf ...

  6. C# ASP.NET MVC 配置允许跨域访问

    在web.config文件中的 system.webServer 节点下 增加如下配置 <httpProtocol> <customHeaders> <add name= ...

  7. 定位内网中毒主机IP经历小记

    一.事件起因 客户向公司反映使用IDS设备捕获到木马上线域名需要处理,虽然是逆向岗但还是有预感未来应急响应的工作只会越来越多.所以作为新人的我选择了跟带头BOSS去现场学习,并且将自己参与应急响应中的 ...

  8. MySQL— 索引

    目录 一.索引 二.索引类型 三.索引种类 四.操作索引 五.创建索引的时机 六.命中索引 七.其它注意事项 八.LIMIT分页 九.执行计划 十.慢查询日志 一.索引 MySQL索引的建立对于MyS ...

  9. Linux的capability深入分析(1)【转】

    转自:https://blog.csdn.net/wangpengqi/article/details/9821227 一)概述: )从2.1版开始,Linux内核有了能力(capability)的概 ...

  10. centos6.5下java和tomcat环境部署

    软件包: tomcat安装包 apache-tomcat-7.0.67.zip jdk安装包 jdk-6u10-linux-x64.bin 下载地址:http://www.oracle.com/tec ...