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. [javaSE] IO流(装饰设计模式)

    装饰设计模式:当想要对已有的对象进行功能增强时,可以自定义类将已有的对象传入,并提供加强功能,自定义的该类称为装饰类 典型的: Reader--FileReader --BufferedReader ...

  2. JAVA基础之——String、StringBuilder、StringBuffer区别和使用场景

    本文主要讲解String.StringBuilder.StringBuffer区别和应用场景 本文以jdk1.8为例 1 String 操作过程:每次赋值时新建一个String对象. 2 String ...

  3. centos 6无法上外网

    1.先配置/etc/sysconfig/network-scripts/ifcfg-eth0 配置完成后能ping通内网.网关,但是上不了外网 DEVICE=eth0 HWADDR=:0C::FF:: ...

  4. php中模糊查询并关联三个select框

    1.在php中我们经常用到下拉框,并相互关联,如果下拉框的option非常多,那么我们就要用到模糊搜索功能,那么怎么做呢? 在此功能中,走了弯路,最好不要关联两个select的id值后select属性 ...

  5. Redis教程基本命令

    Redis是什么? Redis(REmote DIctionary Server)是一个key-value存储系统,能够高速存储数据,value值可以为字符串.哈希表.列表.集合.有序集合,位图,hy ...

  6. css专业术语笔记

    1. 属性 如height.color等,称作css的属性. 2. 值 在css中,如:10px, 50%, #ccc等这些都称作css的值.比较常见的类型值有:整数值,数值,百分比值,长度值,颜色值 ...

  7. iView定制主题报错问题的解决方法

    按照iView官网来是这样的: 1. 在main.js当前目录下新建themes文件夹,里面新建一个叫blue.less的文件 2. 在mian.js里面引入blue.less文件 3. blue.l ...

  8. 利用open live writer工具的Metaweblog技术API接口同步到多个博客。

    测试例子内容: hello world hello metaweblog hello open live writer

  9. python单下划线、双下划线、头尾双下划线说明:

      单下划线.双下划线.头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的. _foo: 以单下划线开头的表示的是 protected 类 ...

  10. Unihan(统汉字)常用字段介绍

    0 背景 1 文件 1.1 IRG Sources 1.2 Dictionary Indices 1.3 Dictionary-like Data 1.4 Other Mappings 1.5 Rad ...