题解 [ZJOI2007]棋盘制作
把悬线法这个坑填了,还是很简单的 qwq。
悬线法一般解决有一定约束条件的最大矩形问题。悬线的定义是从一个点一直往上走直到边界或者不符合条件结束。
炒个例子,在这题里面比如说有这样一个矩形
0 1 0 1
0 1 0 1
1 0 1 0
1 1 1 1
则第 \(4\) 行第 \(3\) 列的点的悬线就是这个
1
0
1(这就是起始的点
我们定义 \(up_{i, j}\) 为 \(i\) 行 \(j\) 列的点的悬线长度。
显而易见,如果可以转移,则有 \(up_{i, j} = up_{i - 1, j} + 1\)。
由于是矩形,我们还要枚举悬线往左移动能到的极远处于往右移动的极远处。
令 \(le_{i, j}\) 为第 \(i\) 行 \(j\) 列的点的悬线往左移动的极远处,\(ri_{i, j}\) 是往右的极远处。
如果 \(a_{i, j} \not = a_{i - 1, j}\),则有 \(le_{i, j} = \max\{le_{i, j}, le_{i - 1, j}\}, ri_{i, j} = \min\{ri_{i, j}, ri_{i - 1, j}\}\)。
为什么左边界取 \(\max\),右边界取 \(\min\) 呢?这不是求最近的边界吗?
其实这很好理解,首先我们画个图(丑陋预警(

拿这玩意儿画网格图我是什么个天才(悲
点 F 是我们当前所在的点,,我们假设 F 在第 \(i\) 行 \(j\) 列。EF 是 F 的悬线。CD 代表 EF 目前往左移动更新的极远处,GH 代表 EF 目前往右移动更新的极远处,AB 代表 \(i - 1\) 行 \(j\) 列的悬线往左的极远处,IJ 代表往右的极远处。
显然,我们的 CD 应该被更新成 AB,GH 应该被更新成 IJ。原因很简单,以 AB 为例,AB 已经被更新过了,是极左的,那么它为什么没有更新到 CD 那一行呢,因为 CD 与 AB 之间出现了不合法的,那么我们就不能更新到 AB,得更新到 CD。GH 与 IJ 的更新同理。
那么问题又来了,这能保证是极远处吗?显然可以。证明和上面差不多,不写了。
还有一个问题,我发现基本上所有的文章都没有提到,只是在代码里面写了怎么可以这样(恼,还有一个问题,还是上面那张图
。
图逐渐走向艺术派
我们会发现我们的方程没有考虑这里的红色部分是否合法。所以我们要在之前提前处理。如果可以 \(a_{i, j} \not = a_{i, j - 1}\),则 \(le_{i, j} = le_{i, j - 1}\)(这里 \(j\) 正序枚举)。如果 \(a_{i, j} \not = a_{i, j + 1}\) 则 \(ri_{i, j} = ri_{i, j + 1}\)(这里 \(j\) 倒序枚举)
这个应该很好理解因为我语文不好其实是懒我就不多解释了 qwq
代码:
//SIXIANG
#include <iostream>
#define MAXN 2000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int a[MAXN + 10][MAXN + 10], up[MAXN + 10][MAXN + 10], le[MAXN + 10][MAXN + 10], ri[MAXN + 10][MAXN + 10];
int main() {
int n, m;
cin >> n >> m;
for(int p = 1; p <= n; p++)
for(int i = 1; i <= m; i++) {
cin >> a[p][i];
up[p][i] = 1;
le[p][i] = ri[p][i] = i;
}
for(int p = 1; p <= n; p++)
for(int i = 2; i <= m; i++)
if(a[p][i] != a[p][i - 1])
le[p][i] = le[p][i - 1];
for(int p = 1; p <= n; p++)
for(int i = m - 1; i >= 1; i--)
if(a[p][i] != a[p][i + 1])
ri[p][i] = ri[p][i + 1];
int ans1 = 0, ans2 = 0;
for(int p = 1; p <= n; p++) {
for(int i = 1; i <= m; i++) {
if(p > 1 && a[p][i] != a[p - 1][i]) {
up[p][i] = up[p - 1][i] + 1;
le[p][i] = max(le[p][i], le[p - 1][i]);
ri[p][i] = min(ri[p][i], ri[p - 1][i]);
}
int a = up[p][i], b = ri[p][i] - le[p][i] + 1;
int c = min(a, b);
ans1 = max(ans1, c * c);
ans2 = max(ans2, a * b);
}
}
cout << ans1 << ' ' << ans2 << endl;
}
其它题目就可以用类似的板子套上去(所以我就理直气壮的不写啦(
题解 [ZJOI2007]棋盘制作的更多相关文章
- [洛谷P1169][题解][ZJOI2007]棋盘制作
我不是题目的说 这道题运用了一种很巧妙的DP方式:悬线法 如图,蓝色为悬线,黄色为向两边延伸的长度 那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略) 所以我们可以维护三个数组: Up[i][ ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
- BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...
- 洛谷 P1169 [ZJOI2007]棋盘制作
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...
- BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1848 Solved: 936 [Submit][Sta ...
- bzoj 1057: [ZJOI2007]棋盘制作 单调栈
题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 1019[Submit] ...
- BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...
- P1169 [ZJOI2007]棋盘制作 && 悬线法
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
- 1057: [ZJOI2007]棋盘制作
1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...
随机推荐
- day21 单列索引与组合索引 & 索引的优点和使用原则 & 视图与函数
索引 1.索引有几种 四种,单列索引,组合索引,全文索引,空间索引 2.索引的优点 所有的MySQL数据库列类型都可以被索引,也就是可以给任意字段加索引 提高数据查询速度 索引的缺点 1)创建索引和维 ...
- 环境安装-Centos7.4安装及配置
环境安装-Centos7.4安装及配置 〇.资料汇总 一.虚拟机安装 1.下载地址 https://pan.baidu.com/s/1zcOp06HX4OxPdsCCGkHbXQ 提取码:7777 2 ...
- JavaEE Day09 JavaScript基础
之前学了html.css两种静态资源 JavaScript是另一种静态资源,今日内容[重点]:JavaScript(是一门编程语言,2days)基础 一.JavaScript简介 1.概念 JavaS ...
- 一图看懂Hadoop中的MapReduce与Spark的区别:从单机数据系统到分布式数据系统经历了哪些?
今日博主思考了一个问题:Hadoop中的MapReduce与Spark他们之间到底有什么关系? 直到我看到了下面这张图 废话不多说先上图 我们知道,单机数据系统,在本地主机上针对数据有单机本地存储操作 ...
- Flaks框架(g对象,session,数据库连接池,信号,flask-script,SQLAlchemy(ORM))
目录 一:g对象 简介 1.g对象和session的区别 2.g对象实战代码 二:flask-session(借助于第三方插件连接redis保存session ) 1.方式一: 2.方式二(flask ...
- 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结
随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了"智能座舱"这种新一代人机交互方式.面对竞争如此激烈的车机市 ...
- day03-功能实现02
家居网购项目实现02 5.功能04-会员登录 5.1需求分析/图解 需求如图: 输入用户名.密码后提交 判断该用户是否存在 如果存在,显示登录成功页面 否则返回登录页面,要求重新登录 要求改进登录密码 ...
- 模仿 vscode-server 把本地代码目录映射到外网
目录 概述 分析 解决方案 准备一台VM 创建容器 SmartIDE 创建 直接使用 docker 创建 SSH 远程转发 内网穿透 ngrok frp 服务端 客户端 本文模仿 vscode-ser ...
- c语言学习总结(原创)
什么是标识符? 标识符是用来标识变量.函数.类.模块,或者任何其他用户自定义项目的名称,用它来命名程序正文中的一些实体,比如函数名.变量名.类名.对象名等.如:int a1=0; const b1=& ...
- Less常用功能使用
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充.Less 可以运行在 Node 或浏览器端. L ...