想了很久的dp,看了一眼题解之后感觉自己被安排了。

发现从一个矩形中选择三个不相交的正方形一共只有六种取法。

那么我们可以处理出四个值:

$f_{i, j}$分别表示以$(i, j)$为右下角,左下角,右上角,左上角的矩阵中选一个$k*k$正方形的最大值。

这样就可以算出前四种情况,后两种情况只要乱搞就可以了。

时间复杂度$O(nm)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = ; int n, m, k, ans, a[N][N], sum[N][N], s[N][N];
int f1[N][N], f2[N][N], f3[N][N], f4[N][N], r[N], c[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline int max(int x, int y, int z) {
return max(max(x, y), z);
} int main() {
read(n), read(m), read(k);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++) {
read(a[i][j]);
sum[i][j] = sum[i][j - ] + a[i][j];
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
sum[i][j] += sum[i - ][j];
for(int i = k; i <= n; i++)
for(int j = k; j <= m; j++)
s[i][j] = sum[i][j] + sum[i - k][j - k] - sum[i][j - k] - sum[i - k][j]; /* for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= m; j++)
printf("%d ", s[i][j]); */ for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
chkMax(f1[i][j], max(s[i][j], f1[i - ][j], f1[i][j - ]));
for(int i = ; i <= n; i++)
for(int j = m; j >= ; j--)
chkMax(f2[i][j], max(s[i][j + k - ], f2[i - ][j], f2[i][j + ]));
for(int i = n; i >= ; i--)
for(int j = m; j >= ; j--)
chkMax(f3[i][j], max(s[i + k - ][j + k - ], f3[i + ][j], f3[i][j + ]));
for(int i = n; i >= ; i--)
for(int j = ; j <= m; j++)
chkMax(f4[i][j], max(s[i + k - ][j], f4[i + ][j], f4[i][j - ])); ans = ;
for(int i = k; i <= n - k; i++)
for(int j = k; j <= m - k; j++) {
chkMax(ans, f1[i][j] + f2[i][j + ] + f3[i + ][]);
chkMax(ans, f1[i][j] + f2[n][j + ] + f4[i + ][j]);
chkMax(ans, f1[n][j] + f2[i][j + ] + f3[i + ][j + ]);
chkMax(ans, f1[i][m] + f4[i + ][j] + f3[i + ][j + ]);
} for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++) {
chkMax(r[i], s[i][j]);
chkMax(c[j], s[i][j]);
} for(int i = k; i <= n - * k; i++)
for(int j = i + k, mid = r[j]; j <= n - k; j++, chkMax(mid, r[j]))
chkMax(ans, f1[i][m] + mid + f3[j + ][]);
for(int i = k; i <= m - * k; i++)
for(int j = i + k, mid = c[j]; j <= m - k; j++, chkMax(mid, c[j]))
chkMax(ans, f1[n][i] + mid + f2[n][j + ]); printf("%d\n", ans);
return ;
}

Luogu 3625 [APIO2009]采油区域的更多相关文章

  1. [APIO2009]采油区域

    题目描述 Siruseri 政府决定将石油资源丰富的 Navalur 省的土地拍卖给私人承包商以 建立油井.被拍卖的整块土地为一个矩形区域,被划分为 M×N 个小块. Siruseri 地质调查局有关 ...

  2. 洛谷P3625 - [APIO2009]采油区域

    Portal Description 给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大. Sol ...

  3. [SOJ #686]抢救(2019-11-7考试)/[洛谷P3625][APIO2009]采油区域

    题目大意 有一个\(n\times m\)的网格,\((x,y)\)权值为\(a_{x,y}\),要求从中选取三个不相交的\(k\times k\)的正方形使得它们权值最大.\(n,m,k\leqsl ...

  4. [P3625][APIO2009]采油区域 (前缀和)

    这道题用二维前缀和可以做 难度还不算高,细节需要注意 调试了很久…… 主要是细节太多了 #include<bits/stdc++.h> using namespace std; #defi ...

  5. bzoj1177&p3625 [APIO2009]采油区域p[大力讨论]

    我好菜菜啊. 给定矩形,从中选出三个边长K的正方形互不重叠,使得覆盖到的数总和最大. 想的时候往dp上钻去了..结果一开始想了一个错的dp,像这样 /************************* ...

  6. 洛谷 P3625 [APIO2009]采油区域【枚举】

    参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog懒得画了 bzoj蜜汁TTT ...

  7. Java实现 蓝桥杯VIP 算法训练 采油区域

    算法训练 采油区域 时间限制:2.0s 内存限制:512.0MB 提交此题 查看参考代码 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整 ...

  8. 【luogu P3627 [APIO2009]抢掠计划】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...

  9. [Luogu P3626] [APIO2009] 会议中心

    题面 传送门:https://www.luogu.org/problemnew/show/P3626 Solution 如果题目只要求求出第一问,那这题显然就是大水题. 但是加上第二问的话...... ...

随机推荐

  1. dilworth定理的通俗讲解

    度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两 ...

  2. poj3061 Subsequence&&poj3320 Jessica's Reading Problem(尺取法)

    这两道题都是用的尺取法.尺取法是<挑战程序设计竞赛>里讲的一种常用技巧. 就是O(n)的扫一遍数组,扫完了答案也就出来了,这过程中要求问题具有这样的性质:头指针向前走(s++)以后,尾指针 ...

  3. 转载:Java就业企业面试问题-电商项目

    转载: http://blog.csdn.net/qq_33448669/article/details/73657642

  4. 大鱼吃小鱼(运用stack的模拟)

    个人心得:这一题在暑假集训的周测里做到过,当时就死模拟,然后卡了很久很久才做对.现在发现运用stack其实非常方便, 将向左向右游动的鱼分开,则往后走只要往右移动的就放入stack,往左的时候就与st ...

  5. H国的身份证号码(搜索)

    个人心得:巧妙利用数字进行维护就好了,深搜还是有点心得的: #1558 : H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位 ...

  6. 学习动态性能表(8)--v$lock&v$locked_object

    学习动态性能表 第八篇-(1)-V$LOCK  2007.5.31 这个视图列出Oracle 服务器当前拥有的锁以及未完成的锁或栓锁请求.如果你觉着session在等待等待事件队列那你应该检查本视图. ...

  7. Nexus安装以及2,3比较

    解压缩之后, 进入nexus-3.6.2-01/bin文件夹中,执行: ./nexus start 如果使用root将会得到一个告警:Detected execution as "root& ...

  8. virtualvm一次插件安装想到的

    在麒麟操作系统visualvm安装插件失败,因为使用的内网,所以在官网下载了插件到本地:因为本地安装的jdk1.6,为了享受jdk1.8,在visualvm文件中增加了对于jdk1.8的引用: exp ...

  9. 浅谈K-D Tree

    初步认识\(K-D\) \(Tree\) \(K-D\) \(Tree\)是一种基于空间分割的二叉树形数据结构,一般用于高维信息检索.因为\(OI\)中很多问题都能转化为高维信息检索,所以\(K-D\ ...

  10. XSS与CSRF攻击

    一.XSS Cross Site Script,跨站脚本攻击.是指攻击者在网站上注入恶意客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一 ...