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. 微信小程序实现滚动分页加载更多

    参考网址:https://www.cnblogs.com/Smiled/p/8203306.html 1.wxml: <view class='myScroll' style='float:le ...

  2. RecycleView 使用自定义CardLayouManager内容无法滚动问题

    1.开始一直反应不过来一个问题:RecycleView不是自带滚动效果吗?为啥子条目还不能全部滚动,显示出来呢? 意识到:只有当RecycleView 适配器中条目数量特别多,才可以滚动. 然而自己的 ...

  3. Gradle 在Eclipse中的使用

    eclipse上gradle插件的安装 1)在Eclipse中选择Help -> Eclipse Marketplace…,输入buildship点击Go,然后选择Install安装Gradle ...

  4. Using Fetch

    [Using Fetch] This kind of functionality was previously achieved using XMLHttpRequest. Fetch provide ...

  5. Activty左出右进动画

    [Activty左出右进动画] public void overridePendingTransition (int enterAnim, int exitAnim) 其中: enterAnim 定义 ...

  6. 针对SO交期回写的工厂日历功能调整

    针对所有SO回写的交期,在最终写入SAP系统时,如果交期落在周日的,则自动往后延迟一天到周一,前期已经开发的长节假日UI维护的功能不变(按照UI的开始和结束时间跳过此段时间不规划). 当加1天时落在国 ...

  7. 修改weblogic启动模式:client改为server

    1.生产模式 -> 开发模式 Step 1:将domain下的 /weblogic/domain/app_domain/bin/setDomainEnv.sh文件的PRODUCTION_MODE ...

  8. 使用rsync 同步数据一些常用参数和示例

    rsync rsync是linux系统下的数据镜像备份工具.支持远程同步,本地复制,或者与其他SSH.rsync主机同步. 包括本地推到远程,远程拉到本地两种同步方式,也可以实现本地不同路径下文件的同 ...

  9. python基础之字符串常用操作总结

    字符串的索引 s = 'ABCDLSESRF' # 索引 这两个很简单没什么说的 s1 = s[0] print(s1) # A s2 = s[2] print(s2) # C 切片 s = 'ABC ...

  10. getHibernateTemplate()的用法 (转)

    在spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修改和删除等操作, 此方法是在配置了spring以后,hibernate由spring接管,不直接使 ...