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. 四、curator recipes之共享重入互斥锁

    简介 curator的recipes实现了可重入互斥锁,允许你在分布式场景下多个进程之间实现锁的互斥以协调多进程执行. 相关类:InterProcessMutex 官方文档:http://curato ...

  2. 三、synchronized同步锁

    一.简介 在Java多线程中,我们要实现同步串行最早接触的就是synchronized关键字. 基本语法如下: synchronized(锁) { // 代码块 } sychronized关键字的锁主 ...

  3. Z_Tree的使用案例(出差地点的演示)

    1.准备工作(下载zTree并添加到项目JS中) 2.HTML代码 <link rel="stylesheet" href="./js/zTree_v3-3.5.2 ...

  4. Ubuntu14.04默认cmake升级为3.x

    由于Ubuntu14.04的cmake版本为2.8.x,而如果需要cmake3.x版本时,无法生成makefile,有两种方法可以安装cmake3.4.1: sudo apt-get install ...

  5. K:找寻数组中第n大的数组元素的三个算法

    相关介绍:  给定一个数组,找出该数组中第n大的元素的值.其中,1<=n<=length.例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9.解决该问题的算法 ...

  6. 实习小结(二)--- SSM框架搭建

    SSM项目框架搭建 前几天做了一个学生信息管理的项目,使用纯控制台输入,查询数据库,将信息在控制台中打印,功能完善得差不多之后,老师让将这个项目移植到Web中,使用Spring+SpringMVC+M ...

  7. 01:谁考了第k名 个人博客:doubleq.win

    个人博客:doubleq.win 01:谁考了第k名 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的 ...

  8. 浏览器根对象window之值为字符串的属性

    1. string属性 1.1 origin window.origin使用返回的是当前网页的网址.打开百度首页,并在控制台中输入 window.origin 控制台中会输出"https:/ ...

  9. LeetCode 514----Freedom Trail

    问题描述 In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a ...

  10. Recovering InnoDB table from an .ibd file.

    Recovering an InnoDB table from only an .ibd file. Sometime you may need to recover a table when all ...