BZOJ1177:[APIO2009]Oil(枚举,前缀和)
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
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
Solution
首先可以发现将矩形划分成三个部分,只有上图的六种划分方法。
我们只需要六种情况枚举分界线,然后用递推预处理每一个划分出的矩形内的最大值。
具体实现需要五个数组$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(枚举,前缀和)的更多相关文章
- [BZOJ1177][Apio2009]Oil
[BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...
- bzoj1177 [Apio2009]Oil 二维前缀最大值,和
[Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2300 Solved: 932[Submit][Status][Disc ...
- BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1177 题意概括 在一个n*m的矩阵中,每一个位置一个数字. 现在让你选出3个k*k的矩阵,它们互不 ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
- BZOJ 1201 [HNOI2005]数三角形:枚举 + 前缀和
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1201 题意: 有一个边长为n的正三角形网格,去掉其中一些线段,问你在这幅图中有多少个三角形 ...
- NOIP2016 T4 魔法阵 暴力枚举+前缀和后缀和优化
想把最近几年的NOIP T4都先干掉,就大概差16年的,所以来做一做. 然后这题就浪费了我一整天QAQ...果然还是自己太弱了QAQ 点我看题 还是pa洛谷的... 题意:给m个物品,每个物品有一个不 ...
- Best Reward HDU - 3613(马拉车+枚举+前缀和)
题意: 给你一串字符串,每个字符都有一个权值,要求把这个字符串在某点分开,使之成为两个单独的字符串 如果这两个子串某一个是回文串,则权值为那一个串所有的字符权值和 若不是回文串,则权值为0 解析: 先 ...
- Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D "Or" Game 枚举+前缀后缀
D. "Or" Game ...
- 【BZOJ 1177】 [Apio2009]Oil
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如上图. 显然如果三个正方形.只可能是上面的情况. 则可以处理一下左上角.右上角.左下角.右下角的前缀最大正方形(dp),以及以某一 ...
随机推荐
- php中的namespace 命名空间
名字解释: namespace(命名空间),命名空间是从php5.3开始支持的功能.作用主要有两个:1.可以避免类名取得过长.2.当在多个框架配合使用时,同名的类之间不会冲突. 命名空间,看名字就知道 ...
- 九、curator recipes之不可重入锁InterProcessSemaphoreMutex
简介 recipes的InterProcessSemaphoreMutex是一种不可重入的互斥锁,也就意味着即使是同一个线程也无法在持有锁的情况下再次获得锁,所以需要注意,不可重入的锁很容易在一些情况 ...
- 内部类 ( Inner Class )
内部类的作用: 1.隐藏内部实现,高内聚. 2.Java多继承的实现. 何为Java的多继承? Java只支持单一继承,所以如果需要多继承,那么可用内部类来实现. 如何实现? 1.父类A public ...
- tomcat-虚拟目录的映射
虚拟目录的映射 1.新建 ${tomcat安装目录}\conf\Catalina\localhost\xxx.xml 文件. 文件内容: <Context path="/xxx&qu ...
- java 简单计算器
package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...
- input file样式美化
默认样式: <input type="file" /> 美化样式时: 将其设置为透明,设置宽高覆盖到需要用的地方,宽100%,高100% 可以用到定位 .box{ po ...
- FCC上的javascript算法题之中级篇
FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的 ...
- laravel开发之-安装汉化语言包
第一种方法: 1.输入命令:composer require "overtrue/laravel-lang:dev-master" 2.将config/app.php中命令“Ill ...
- C#编写强大的SQL Server数据库自动备份服务
数据库自动备份服务,带配置,还算可以吧 周末抽时间,编写了一个这样的工具,可以让,对数据库不了解或不熟悉的人,直接学会使用备份,省时省力,同样,我也将一份,通过脚本进行备份的,也奉献上来, 通过sql ...
- 强化学习系列之:Deep Q Network (DQN)
文章目录 [隐藏] 1. 强化学习和深度学习结合 2. Deep Q Network (DQN) 算法 3. 后续发展 3.1 Double DQN 3.2 Prioritized Replay 3. ...