Luogu 1169 [ZJOI2007]棋盘制作 - 动态规划+单调栈
Description
给一个01矩阵, 求出最大的01交错的正方形和最大的01交错的矩阵
Solution
用动态规划求出最大的正方形, 用单调栈求出最大的矩阵。
在这里仅介绍求出最大正方形(求最大矩阵 = 单调栈裸题 传送门 : 不会单调栈的同学可以去学
定义数组$f[ i ][ j ]$ 为以$(i, j) $为右下角的正方形的边长
$up[ i ][ j ]$ 表示从点$(i, j)$往上 $01$交错的长度
$lef[ i ][ j ]$ 表示从点$(i, j)$往右$01$交错的长度
当 $a[ i ][ j ] != a[i - 1][j - 1]$时才可由上一个正方形继续拓展, 否则长度 $f[ i ][ j ] = 1$
于是有转移方程:
$f[ i ][ j ] = 1$ $a[ i ][ j ] == a[i - 1][j - 1]$
$f[ i ][ j ] = min(f[ i - 1][ j - 1] + 1, lef[ i ][ j ], up[ i ][ j ])$ $ a[ i ][ j ] != a[i - 1][ j ]$
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
#define rep(i,a,b) for(register int i = (a); i <= (b); i++)
#define per(i,a,b) for(register int i = (a); i >= (b); --i)
#define R register
using namespace std; const int N = 3e3; int n, m, a[N][N], pre[N], nxt[N], h[N], ans2;
int lf[N][N], u[N][N], f[N][N], ans1;
int st[N], tp; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} void work(int x) {
rep(i, , m) pre[i] = , nxt[i] = m + ;
rep(i, , m)
if(a[x][i] != a[x - ][i]) h[i]++;
else h[i] = ;
tp = ;
rep(i, , m) {
int pr = ;
while(tp) {
if(h[st[tp]] >= h[i]) tp--;
else {
pr = st[tp]; break;
}
}
pre[i] = pr;
st[++tp] = i;
}
tp = ;
per(i, m, ) {
int nt = m + ;
while(tp) {
if(h[st[tp]] >= h[i]) tp--;
else {
nt = st[tp]; break;
}
}
nxt[i] = nt;
st[++tp] = i;
}
rep(i, , m) {
int nt = nxt[i], pr = pre[i];
rep(j, i + , nt)
if(a[x][j] == a[x][j - ]) {nt = j; break;}
per(j, i - , pr)
if(a[x][j] == a[x][j + ]) {pr = j; break;}
ans2 = max(ans2, (nt - pr - ) * h[i]);
}
} int main()
{
n = rd; m = rd;
memset(a, -, sizeof(a));
rep(i, , n) rep(j, , m) a[i][j] = rd;
rep(i, , n) rep(j, , m) {
f[i][j] = ;
if(a[i][j] != a[i][j - ])
lf[i][j] = lf[i][j - ] + ;
else lf[i][j] = ;
if(a[i][j] != a[i - ][j])
u[i][j] = u[i - ][j] + ;
else u[i][j] = ;
if(a[i][j] != a[i - ][j - ]) continue;
f[i][j] = min(u[i][j], lf[i][j]);
f[i][j] = min(f[i - ][j - ] + , f[i][j]);
ans1 = max(ans1, f[i][j]);
}
printf("%d\n", ans1 * ans1);
rep(i, , n) work(i);
printf("%d\n", ans2);
}
Luogu 1169 [ZJOI2007]棋盘制作 - 动态规划+单调栈的更多相关文章
- [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]
[luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...
- 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...
- 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)
点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...
- 【Luogu】P1169棋盘制作(单调栈)
题目链接 唉……这种题放在NOIP以前我是会做的……但是为什么现在反而不会了…… 单调栈.预处理每个点向上能扩展的最大距离,左右用两遍单调栈扫一遍.注意边界. #include<cstdio&g ...
- bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...
- [luoguP1169] [ZJOI2007]棋盘制作(单调栈)
传送门 和玉蟾宫差不多 ——代码 #include <cstdio> #include <iostream> using namespace std; ; int n, m, ...
- luogu 1169 [ZJOI2007]棋盘制作 悬线dp
悬线法,虽然得不到局部最优解,但是一定能得到全局最优解的算法,十分神奇~ #include <cstdio> #include <algorithm> #define N 20 ...
- luogu 1169 棋盘制作(单调栈/悬线)
luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
随机推荐
- oracle RMAN使用
一步一步学RMAN 备份 RMAN连接上ORACLE,WINDOWS下在命令模式下 RMAN TARGET / 连接本地数据库用的是本地认证模式.RMAN连接数据库必须在dedicate模式下.因此在 ...
- Java:类加载机制及反射
一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...
- jmeter 在linux服务器的安装和运行;
linux环境下使用jmeter进行压力测试 标签(空格分隔): linux环境,jmeter linux环境下使用就meter进行压力测试: linux环境部署: 在Linux服务器先安装jdk: ...
- javascript 执行环境,作用域、作用域链、闭包
1.执行环境 执行环境是JavaScript中国最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数 ...
- 三、Template 模板模式
需求:有规格的尺子,不管何种笔写,写出的字大小.形状都是一样的?抽象为处理流程一致,仅仅是不同的实现 代码清单: 抽象类: public abstract class AbstractDisplay{ ...
- 安装 Laravel 遇到问题?你需要更新 composer.json 文件
转载自 https://9iphp.com/web/laravel/laravel-install-fail-update-composer.html 在使用最新版 Composer 安装 Larav ...
- L2与L1正则化理解
https://www.zhihu.com/question/37096933/answer/70507353 https://blog.csdn.net/red_stone1/article/det ...
- 多线程通信(wait和notify)
线程通信概念: 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一.当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时 ...
- 微信小程序开发——开发者工具无法输入中文的处理
问题模块 框架类型 问题类型 操作系统 工具版本 开发者工具 小程序 Bug Windows v.02.1810290 异常描述: 无法输入中文,偶现,但是概率有点高,重启,重装,更新版本等等都未解决 ...
- 微信小程序开发小技巧——单击事件传参、动态修改样式、轮播样式修改等
一. 脚本部分: 1. 表达式无效的处理: 如果你发现自己编写的表达式无效或者数据不展示,那么请先检查你的表达式是否有添加{{}},小程序中全部都要添加的,只要是在模板中调用js中的数据 2. 获取元 ...