Description

采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方形区域。 AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的K×K的区域使得总的收益最大。 例如,假设石油储量的估计值如下:

1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9

如果K = 2, AoE公司可以承包的区域的石油储量总和为100, 如果K = 3, AoE公司可以承包的区域的石油储量总和为208。 AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量之和的最大值。

Input

输入第一行包含三个整数M, N, K,其中M和N是矩形区域的行数和列数,K是每一个承包商承包的正方形的大小(边长的块数)。接下来M行,每行有N个非负整数表示这一行每一小块土地的石油储量的估计值

Output

输出只包含一个整数,表示AoE公司可以承包的区域的石油储量之和的最大值。

Sample Input

9 9 3
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9

Sample Output

208

Solution

以为是什么巧妙的DP状态设计= =MD结果ta是个大分类讨论……?
一个地方=打成了-找了半天错误……

首先可以发现将矩形划分成三个部分,只有上图的六种划分方法。

我们只需要六种情况枚举分界线,然后用递推预处理每一个划分出的矩形内的最大值。

具体实现需要五个数组$sum$,$a$,$b$,$c$,$d$

其中$sum[i][j]$表示以$(i,j)$为右下角的矩形权值和。

$a[i][j]$表示右下角在$(1,1)(i,j)$内的最大矩形。

$b[i][j]$表示右下角在$(i,j)(1,m)$内的最大矩形。

$c[i][j]$表示右下角在$(1,n)(i,j)$内的最大矩形。

$d[i][j]$表示右下角在$(i,j)(n,m)$内的最大矩形。

Code

 #include<iostream>
#include<cstdio>
#include<algorithm>
#define N (1509)
using namespace std;
int n,m,k,x,ans,sum[N][N],a[N][N],b[N][N],c[N][N],d[N][N];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
{
scanf("%d",&x);
sum[i][j]=x+sum[i-][j]+sum[i][j-]-sum[i-][j-];
}
for (int i=n; i>=k; --i)
for (int j=m; j>=k; --j)
sum[i][j]=sum[i][j]-sum[i-k][j]-sum[i][j-k]+sum[i-k][j-k];
for (int i=k; i<=n; ++i)
for (int j=k; j<=m; ++j)
a[i][j]=max(sum[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(sum[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(sum[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(sum[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; i<=n-k; ++i)
for (int j=k; j<=m-k; ++j)
ans=max(ans,a[i][m]+c[i+k][j]+d[i+k][j+k]);
for (int i=k; i<=n-k; ++i)
for (int j=k; j<=m-k; ++j)
ans=max(ans,a[i][j]+b[n][j+k]+c[i+k][j]);
for (int i=k; i<=n-k; ++i)
for (int j=k; j<=m-k; ++j)
ans=max(ans,a[n][j]+b[i][j+k]+d[i+k][j+k]);
for (int i=k; i<=n-k; ++i)
for (int j=k+k; j<=m-k; ++j)
ans=max(ans,a[n][j-k]+b[n][j+k]+sum[i][j]);
for (int i=k+k; i<=n-k; ++i)
for (int j=k; j<=m-k; ++j)
ans=max(ans,a[i-k][m]+c[i+k][m]+sum[i][j]);
printf("%d\n",ans);
}

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 二维前缀和 二维前缀最值

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1177 题意概括 在一个n*m的矩阵中,每一个位置一个数字. 现在让你选出3个k*k的矩阵,它们互不 ...

  4. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil

    1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1477  Solved: 589[Submit] Descri ...

  5. BZOJ 1201 [HNOI2005]数三角形:枚举 + 前缀和

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1201 题意: 有一个边长为n的正三角形网格,去掉其中一些线段,问你在这幅图中有多少个三角形 ...

  6. NOIP2016 T4 魔法阵 暴力枚举+前缀和后缀和优化

    想把最近几年的NOIP T4都先干掉,就大概差16年的,所以来做一做. 然后这题就浪费了我一整天QAQ...果然还是自己太弱了QAQ 点我看题 还是pa洛谷的... 题意:给m个物品,每个物品有一个不 ...

  7. Best Reward HDU - 3613(马拉车+枚举+前缀和)

    题意: 给你一串字符串,每个字符都有一个权值,要求把这个字符串在某点分开,使之成为两个单独的字符串 如果这两个子串某一个是回文串,则权值为那一个串所有的字符权值和 若不是回文串,则权值为0 解析: 先 ...

  8. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D "Or" Game 枚举+前缀后缀

                                                                            D. "Or" Game       ...

  9. 【BZOJ 1177】 [Apio2009]Oil

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如上图. 显然如果三个正方形.只可能是上面的情况. 则可以处理一下左上角.右上角.左下角.右下角的前缀最大正方形(dp),以及以某一 ...

随机推荐

  1. dapper 多对多查询对象和对象列表

    splitOn参数:用来指定列为分隔列,之前的列为前一对象,之后的列为后一对象. lookup 用来保存中间处理结果,可以理解为将结果归组出Group对象,并为其RightsList添加内容, 注意: ...

  2. Toolstrip 工具栏控件

    工具栏是另一种获取应用程序主要功能的常用方法,比起菜单更直观.   Tool strip 控件是由system.Windows.forms.Toolstrip类提供的,作用是创建易于自定义的常用工具栏 ...

  3. java加载redis以及基本操作

    前言: Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server).Redis的键值可以包括字符串(st ...

  4. 说说JSON和JSONP区别

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...

  5. webpack打包踩坑之TypeError: Cannot read property 'bindings' of null

    file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...

  6. python_Django 实现登入功能form表单的参数接收处理

    1.创建Django工程. 参考https://www.cnblogs.com/CK85/p/10159159.html中步骤. 2.在urls.py文件中添加url分发路径 "" ...

  7. MvcForum中文版+PostgreSql源码下载

    演示地址:http://bbs.hfenxiao.com 因为种处原因在家休假,闲来无事,便将去年关注的一个基于asp.net mvc论坛程序拿出来做了一些调整. 据说PostgreSql是世界上功能 ...

  8. Qt Quick程序的发布

    要将程序发布出去,首先需要使用release方式编译程序,然后将生成的.exe可执行文件和需要的库文件发在一起打包进行发布. 要确定需要哪些动态库文件,可以直接双击.exe文件,提示缺少那个dll文件 ...

  9. 一键清理 Nexus 中无用的 Docker 镜像

    现许多团队使用 Nexus 来管理 Docker 镜像,产品不断迭代,镜像仓库占用的磁盘空间也越来越大.由于 Nexus 的控制台并未提供批量操作镜像功能,清理镜像十分不便.本文分享一个清理 Nexu ...

  10. Android 图文混排 通过webview实现并实现点击图片

    在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail< ...