[BZOJ 1177] Oil
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1177
Solution:
相当于将大矩形分为3块,取每块中最大的正方形
对于此类分成几块的题目,要想到枚举分割线
一共只有这6种情况:

我们只要先预处理左上左下右上右下四个方向最大答案的前缀和,
再对于每种情况枚举分割线即可
对于最左边的两种情况,只要将中间一列的宽度保证为k即可
Code:
#include <bits/stdc++.h> using namespace std;
const int MAXN=+; int n,m,k,t,res=,s[MAXN][MAXN],a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN],d[MAXN][MAXN]; int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&t),s[i][j]=s[i-][j]+s[i][j-]-s[i-][j-]+t;
for(int i=n;i>=k;i--) for(int j=m;j>=k;j--) s[i][j]-=s[i-k][j]+s[i][j-k]-s[i-k][j-k]; for(int i=k;i<=n;i++) for(int j=k;j<=m;j++) a[i][j]=max(s[i][j],max(a[i-][j],a[i][j-]));
for(int i=k;i<=n;i++) for(int j=m-k+;j>=;j--) b[i][j]=max(s[i][j+k-],max(b[i-][j],b[i][j+]));
for(int i=n-k+;i>=;i--) for(int j=k;j<=m;j++) c[i][j]=max(s[i+k-][j],max(c[i+][j],c[i][j-]));
for(int i=n-k+;i>=;i--) for(int j=m-k+;j>=;j--) d[i][j]=max(s[i+k-][j+k-],max(d[i+][j],d[i][j+])); for(int i=k;i<=n;i++) for(int j=k;j<=m;j++) res=max(res,a[i][j]+b[i][j+]+c[i+][m]);
for(int i=n-k+;i>=;i--) for(int j=k;j<=m;j++) res=max(res,c[i][j]+d[i][j+]+a[i-][m]);
for(int i=k;i<=n;i++) for(int j=k;j<=m;j++) res=max(res,a[i][j]+c[i+][j]+d[][j+]);
for(int i=k;i<=n;i++) for(int j=m-k+;j>=;j--) res=max(res,b[i][j]+d[i+][j]+c[][j-]); for(int i=*k;i<=n;i++) for(int j=k;j<=m;j++) res=max(res,s[i][j]+a[i-k][m]+c[i+][m]);
for(int j=*k;j<=m;j++) for(int i=k;i<=n;i++) res=max(res,s[i][j]+a[n][j-k]+b[n][j+]); printf("%d",res);
return ;
}
Review:
由求三块权值和最大的不交叉的正方形 -------> 将矩形分为3块 --------> 枚举分割线
碰到求不相交的最值问题时,想到切割+枚举切割线的方法
[BZOJ 1177] Oil的更多相关文章
- BZOJ 1177 Oil(特技枚举)
对于三个正方形的位置一共有六种情况. 预处理出(i,j)左上角,左下角,右上角,右下角区域内最大权值的正方形. 枚举分界线更新答案. 刚开始想了一个错误的DP也是蠢啊. #include<set ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
- 【BZOJ 1177】【APIO 2009】Oil
http://www.lydsy.com/JudgeOnline/problem.php?id=1177 前缀和优化,时间复杂度$O(nm)$ 因为数据不全,快速读入会导致RE,切记! #includ ...
- BZOJ 1177 [Apio2009]Oil(递推)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1177 [题目大意] 给出一个矩阵,从中选出3个k*k且不相交的矩阵,使得其总和最大 [ ...
- [BZOJ]1177: [Apio2009]Oil
题目大意:给出一个n*m的矩阵,选出3个不相交的k*k子矩阵,使得子矩阵中元素和最大.(k<=n,m<=1500) 思路:选出的子矩阵有3种情况:横着排三个.竖着排三个.三角状分布(其中有 ...
- 【BZOJ 1177】 [Apio2009]Oil
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如上图. 显然如果三个正方形.只可能是上面的情况. 则可以处理一下左上角.右上角.左下角.右下角的前缀最大正方形(dp),以及以某一 ...
- 【BZOJ】【1177】【APIO2009】Oil
DP 找出三个正方形,可以转化为将整个油田切成三个矩形块,每块中各找一个正方形区域,切的形式只有6种,分类更新ans即可 题解:http://trinklee.blog.163.com/blog/st ...
- Week Two
2018.12.3: 1.[BZOJ 4819] 2.[BZOJ 4827] 3.[P1919] 4.[FFT模板] 2018.12.4: 1.[NTT] 2.[MTT(CRT)] 3.[MTT(my ...
- BZOJ 4614 【Wf2016】 Oil
题目链接:Oil 感觉同时几线作战有点吃不消啊-- 这道题有一个显然的结论,那就是最优的直线一定过某条线段的端点. 仔细想想很有道理.如果最终的直线没有过线段的端点的话,那么这条直线就一定可以平移,直 ...
随机推荐
- string 类型转换
string转int "; int n = atoi(str.c_str()); cout << n << endl; int转string #include < ...
- 整理一些JavaScript时间处理扩展函数
在JavaScript中,时间处理是经常需要用到的.最近想要慢慢建立自己的代码库,整理了几个之前用到的js处理时间的函数,发出来跟大家分享一下,以后的使用中会不断增加和修改代码库. 把字符串转换为日期 ...
- taotao用户注册前台页面
注册页面效果: 注册jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- Mysql History list length 值太大引起的问题
1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4 64bit 2. 表面现象 数据库操 ...
- [codeforces gym Matrix God]随机矩阵乘法
题目链接:http://codeforces.com/gym/101341/problem/I 随机真是一个神奇的方法.原本矩阵乘法是n^3的复杂度,但是这个题是让判断两个矩阵是否相等,只需要在两个矩 ...
- Codeforces Round #524 (Div. 2) D. Olya and magical square
D. Olya and magical square 题目链接:https://codeforces.com/contest/1080/problem/D 题意: 给出一个边长为2n的正方形,每次可以 ...
- socket编程 ------ BSD socket API
伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...
- MyBatis的SQL语句映射文件详解(二)----增删改查
1.select语句 public List<User> findUser() { // TODO Auto-generated method stub List users= ( ...
- C#与数据库的连接的三种方式
学习了.net的知识从C#一直到MVC,我一直觉得基础很重要,最近有复习一下数据库连接的三种方式 1 返回结果集的一张表 public static DataTable ExecuteDataTabl ...
- Dokuwiki 二次开发记录
Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...