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. 10、springboot之集成druid

    在pom.xml中添加 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid< ...

  2. Java - “JUC”原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...

  3. .NET 垃圾回收浅解

    在说明垃圾回收的实现机制之前,先说明一下垃圾回收存在的背景. 垃圾回收器(GC)是.NET平台中一个很重要的组成部分,.NET垃圾回收机制降低了编写程序的复杂程度,使程序员不用耗费精力去处理析构,成功 ...

  4. 【Android】17.0 UI开发(八)——利用RecyclerView列表控件实现精美的聊天界面

    1.0 首先新建一个项目,名叫:UIBestPractice,目录如下: 2.0 这里需要先准备两张图片,放在app\src\main\res\drawable-xhdpi目录下. 这里图片名称已经制 ...

  5. html技巧

    1.防止盒子透出的解决办法    overflow:hidden:float不为none:display:inline-block:    position不为static&relative  ...

  6. Java 之集合框架 上(9)

    Java 中的集合框架 如果一个类中存在很多相同类型的属性. 例如:学生类 学生可以选课,因此存在很多课程类型的属性.但是每个学生选择的课程的种类和数量是不一样的. 如果将每一个课程类型的属性都列到课 ...

  7. ArcGIS最权威、最专业的技术分享网站:积思园(www.iarcgis.com)

    你对iArcGIS.com说点什么 为什么会有该网站的产生 在这个所谓的“大数据”的时代,每个人都深陷于海量信息无法自拔,因为过多碎片化的数据只会让自己的思维更加迷离,快餐式的阅读只会让自己变得虚胖. ...

  8. Lambda多表联合

    var query = database.Posts // your starting point - table in the "from" statement .Join(da ...

  9. 爬虫day03之scrapy安装与使用

    参考博客 技术问题不要问,业务问题可以问是不是有一种更好的方法? scrapy windows安装 1. 安装scrapy 参考博客 https://www.cnblogs.com/wupeiqi/a ...

  10. CPU纯软件全虚拟化技术

    我们在前面的文章中提到了虚拟化技术的大致分类情况,即分为全虚拟化.半虚拟化和硬件辅助虚拟化3大类.而我们虚拟化技术最主要的虚拟主体就是我们的硬件CPU.内存和IO,那么我们的CPU在全虚拟化模式下如何 ...