题目大意

  有一个有m*n个格子的矩形,每个格子都有黑或白两种颜色。现要求将该矩形分别裁剪成一个小矩形或一个小正方形,使得这个矩形和正方形是个国际象棋棋盘,且面积最大。

题解

  首先,为了简化问题,我们每隔一个格子将颜色翻转,这样题目就变成了最大01子矩阵问题。解决这类问题需要用到悬线法。

  首先,我们规定一个半极大子矩阵为上、左、右边缘由于有障碍而不可继续向上、左、右方向延伸的矩阵。显然我们要求的矩阵是一个半极大子矩阵。对于一个这样的矩阵,我们定义悬线为上边缘的上一排的一个障碍点所在竖直线在矩阵内的部分。那么一个矩阵就相当于悬线在没有障碍的范围内左右移动的结果。因为矩阵中的每一个点都只对应唯一一个悬线,所以我们可以用通过枚举矩形中的每一个点的方法来枚举到所有的半极大子矩阵。首先悬线的长度可以递推求解。定义一个点对应悬线在半极大子矩形中向右移动的长度为RecR[row][col],向左移动的长度为RecL[row][col]。要知道这两个量,我们还需要知道该点可向左最远延伸的距离L[row][col]和向右最远延伸的距离R[row][col],对于一个点,其RecL[row][col] = min(row1,col1与row,col在同一悬线内,包括row, col){L[row1][col1]}。这样子矩阵的面积就可求了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define Clear(a, val) memset(a, val, sizeof(a))
const int MAX_ROW = 2010, MAX_COL = 2010, INF = 0x3f3f3f3f;
int A[MAX_ROW][MAX_COL];
int HorL[MAX_ROW][MAX_COL], HorR[MAX_ROW][MAX_COL], H[MAX_ROW][MAX_COL], RecL[MAX_ROW][MAX_COL], RecR[MAX_ROW][MAX_COL];//Hor:Horizontal Rec:Rectangle
int TotRow, TotCol, AnsSq, AnsRec; void ChangeMap()//一黑一白改为连续黑连续白
{
int st = 1;
for (int row = 1; row <= TotRow; row++)
{
for (int col = st; col <= TotCol; col += 2)
A[row][col] = !A[row][col];
st = st == 1 ? 2 : 1;
}
} void Solve()
{
Clear(HorL, 0), Clear(HorR, 0), Clear(H, 0), Clear(RecL, INF), Clear(RecR, INF);
for (int row = 1; row <= TotRow; row++)
{
for (int col = 1; col <= TotCol; col++)
{
if(A[row][col])
{
HorL[row][col] = HorL[row][col - 1] + 1;
H[row][col] = H[row - 1][col] + 1;
}
}
for (int col = TotCol; col >= 1; col--)
HorR[row][col] = A[row][col] ? HorR[row][col + 1] + 1 : 0;
} for (int row = 1; row <= TotRow; row++)
{
for (int col = 1; col <= TotCol; col++)
{
if (A[row][col])
{
RecL[row][col] = min(HorL[row][col], RecL[row - 1][col]);
RecR[row][col] = min(HorR[row][col], RecR[row - 1][col]);
}
else
RecL[row][col] = RecR[row][col] = INF;
int curSqEdge = min(H[row][col], RecL[row][col] + RecR[row][col] - 1);
AnsSq = max(AnsSq, curSqEdge * curSqEdge);
AnsRec = max(AnsRec, H[row][col] * (RecR[row][col] + RecL[row][col] - 1));
}
}
} void ReverseMap()
{
for (int row = 1; row <= TotRow; row++)
for (int col = 1; col <= TotCol; col++)
A[row][col] = !A[row][col];
} int main()
{
scanf("%d%d", &TotRow, &TotCol);
for (int row = 1; row <= TotRow; row++)
for (int col = 1; col <= TotCol; col++)
scanf("%d", &A[row][col]);
ChangeMap();
Solve();
ReverseMap();
Solve();
printf("%d\n%d\n", AnsSq, AnsRec);
return 0;
}

  

luogu1169 棋盘制作的更多相关文章

  1. luogu1169 棋盘制作 (单调栈)

    先预处理出来从每个位置 以0开始 往右交替最多能放多少格 然后就相当于对每一列做HISTOGRA #include<bits/stdc++.h> #define pa pair<in ...

  2. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  3. 洛谷 P1169 [ZJOI2007]棋盘制作

    2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...

  4. BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 1848  Solved: 936 [Submit][Sta ...

  5. bzoj 1057: [ZJOI2007]棋盘制作 单调栈

    题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 1019[Submit] ...

  6. 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)) ...

  7. [P1169] 棋盘制作 &悬线法学习笔记

    学习笔记 悬线法 最大子矩阵问题: 在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的,边与整个矩形平行或重合的最大子矩形. 极大子矩型:无法再向外拓展的有效子矩形 最大子矩型:最大的一个有效子矩 ...

  8. 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作

    题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...

  9. P1169 [ZJOI2007]棋盘制作 && 悬线法

    P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...

随机推荐

  1. PHP内的包含语句(include(),require(),include_once(),require_once())

    背景:继续总结PHP内的函数. 在一般的程序中,我们经常重复用到一些代码,但是如果只是简单的进行代码复制,则会增加代码的冗余度,不便于程序的运行.因此,我们可以把重复性的代码分离出来,以外部文件的方式 ...

  2. 笔记《精通css》第4章 背景图像,平铺方式,背景定位,圆角框,投影,不透明

    第4章  背景图像,平铺方式,背景定位,圆角框,投影,不透明 1.背景图像 background-image:url() 2.平铺方式 background-repeat:repeat-x repea ...

  3. 影响ERP成功实施的因素及实施方法

    一.影响ERP实施的因素 1.企业自身管理和认识上的问题.在ERP实施过程中没有用变革管理的理念和方法来策划和管理ERP的实施是导致ERP失败的主要原因. ERP作为一种管理工具他的实施本身就是操作手 ...

  4. CSS——滑动门

    在背景图片中可以对图片进行圆角设置,但是这样是写死的.如下图: 情况分析:如果我们li标签中的文字变少了或者变多了,我们就需要重新定义背景图片.所以我们使用滑动门技术.它将图片特殊地方进行分割.宽度利 ...

  5. C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...

  6. [Windows Server 2003] 安装SQL Server 2005

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装SQL S ...

  7. ESX/ESXi 主机的某些存储阵列可能存在读取或写入性能问题 (1002598)

    Last Updated: 12/14/2018Categories: Troubleshooting  Details 免责声明:本文为 ESX/ESXi hosts might experienc ...

  8. webpack-dev-middleware 与 webpack-hot-middlware

    dev-middleware:  live reload的实现: 思考一下我們要如何更新(live reload)呢? 當然是需要取得 webpack 編好的資料啊,於是就需要在從 request 到 ...

  9. uva1584 Circular Sequence(Uva-1584)

    vj:https://vjudge.net/problem/UVA-1584 这个题讲的是一个圆环,圆环上面有一堆字母,找出字典序最小的那一圈 这个题我觉得直接用c语言的strcmp那一套感觉真是用不 ...

  10. java后台处理解析json字符串的两种方式

    简单说一下背景 上次后端通过模拟http请求百度地图接口,得到的是一个json字符串,而我只需要其中的某个key对应的value. 当时我是通过截取字符串取的,后来觉得不太合理,今天整理出了两种处理解 ...