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]棋盘制作 - 动态规划+单调栈的更多相关文章

  1. [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]

    [luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...

  2. 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...

  3. 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)

    点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...

  4. 【Luogu】P1169棋盘制作(单调栈)

    题目链接 唉……这种题放在NOIP以前我是会做的……但是为什么现在反而不会了…… 单调栈.预处理每个点向上能扩展的最大距离,左右用两遍单调栈扫一遍.注意边界. #include<cstdio&g ...

  5. bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...

  6. [luoguP1169] [ZJOI2007]棋盘制作(单调栈)

    传送门 和玉蟾宫差不多 ——代码 #include <cstdio> #include <iostream> using namespace std; ; int n, m, ...

  7. luogu 1169 [ZJOI2007]棋盘制作 悬线dp

    悬线法,虽然得不到局部最优解,但是一定能得到全局最优解的算法,十分神奇~ #include <cstdio> #include <algorithm> #define N 20 ...

  8. luogu 1169 棋盘制作(单调栈/悬线)

    luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...

  9. [luogu P1169] [ZJOI2007]棋盘制作

    [luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...

随机推荐

  1. R语言-画柱形图

    barplot()函数 1.柱形图 > sales<-read.csv("citysales.csv",header=TRUE) #读取数据 > barplot( ...

  2. 微信小程序----搜索框input回车搜索事件

    在微信小程序里的搜索框,按软键盘回车键触发搜索事件. <input type="text"  placeholder="搜索" value="{ ...

  3. conductor编译镜像

    # git clone https://github.com/Netflix/conductor.git # git checkout -b 2.0 remotes/origin/2.0 # cd s ...

  4. ARM9/ARM11/Cortex A8处理器(转载) .

    //toppic:推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器 // 作者:gooogleman //原文地址:http://blog.csdn.net/goooglema ...

  5. WeakHashMap<K,V> 中的弱引用

    相信很多人对WeakHashMap并没有完全理解. WeakHashMap 持有的弱引用的 Key. 1. 弱引用的概念: 弱引用是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生 ...

  6. set集合,深浅拷⻉以及部分知识点补充

    set集合,深浅拷⻉以及部分知识点补充内容:1. 基础数据类型补充2. set集合3. 深浅拷⻉主要内容: ⼀. 基础数据类型补充⾸先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的 ...

  7. NumPy 高级索引

    NumPy 高级索引 NumPy 比一般的 Python 序列提供更多的索引方式.除了之前看到的用整数和切片的索引外,数组可以由整数数组索引.布尔索引及花式索引. 整数数组索引 以下实例获取数组中(0 ...

  8. 支付宝小程序开发之与微信小程序不同的地方

    前言: 本文仅汇总微信小程序移植支付宝小程序过程中遇到的一些不同的地方,详细请参考官方开发文档. 网络请求: 对于网络请求,基本上改动不大,也就支付宝小程序没有responseType属性及响应码字段 ...

  9. 专项测试——移动app安装包检测

    一.背景和现状 安装包的重要性无需多提,针对安装包质量控制越来越严格和规范,包括证书.文件大小.安装成功率等,APP的证书及混淆是影响APP的安装成功率及代码安全性的很大因素,随着功能迭代,安装包也会 ...

  10. f5 SNMP配置

    1.选择监控终端 2.配置团体名称: