具体可以去跪《浅谈用极大化思想解决最大子矩形问题》(p.s. 蒟蒻跪了还是很晕,不过想到之前usaco好像是最后一章的一道题……看了下代码顿然醒悟)

也就是如果用o(nm)的方法维护一个极大矩阵?其实很简单,按行处理,维护u[],l[],r[](向上,向左,向右)每一行先预处理处理出这行中每一个点向右能延展多长(right[j]),向左能延展多长(left[j]),然后再开始处理这一行的点,具体做法是比较这个点(i,j)与上行同一列的点(i-1,j)是否可以连在一起,可以的话,那么u[j]++,l[j]=min(left[j],l[j]),r[j]:=min(right[j],r[j]),如果不可以,那么u[j]=1,l[j]=left[j],r[j]=right[j]。记住u[],l[],r[]的作用,他们表示一个如果以这一行为底边,那么包括进j点的最大矩形的形状u[j]*(r[j]+l[j]-1)。然后好像就是这样了吧。

var
map,f:array[..,..]of longint;
left,right,u,l,r:array[..]of longint;
i,j,k,n,m,ans:longint; function min(x,y:longint):longint;
begin
if x>y then exit(y);
exit(x);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure work1;
var
i,j,k:longint;
begin
ans:=;
for i:= to n do
for j:= to m do begin
if (i=)or(j=) then begin
f[i,j]:=;
continue;
end;
if (map[i-][j]=map[i][j])
or (map[i,j-]=map[i,j])
or (map[i-,j-]<>map[i][j]) then begin
f[i,j]:=;
continue;
end;
f[i,j]:=min(f[i-][j],min(f[i,j-],f[i-,j-]))+;
if f[i,j]>ans then ans:=f[i,j];
end;
writeln(ans*ans);
end; procedure work2;
var
i,j,k:longint;
begin
ans:=;
for i:= to n do begin
left[]:=;
right[m]:=;
for j:= to m do
if map[i,j-]<>map[i,j] then left[j]:=left[j-]+ else left[j]:=;
for j:=m- downto do
if map[i,j+]<>map[i,j] then right[j]:=right[j+]+ else right[j]:=;
for j:= to m do begin
if i= then begin
u[j]:=;
l[j]:=left[j];
r[j]:=right[j];
end
else
if map[i-,j]<>map[i,j] then begin
inc(u[j]);
l[j]:=min(l[j],left[j]);
r[j]:=min(r[j],right[j]);
end
else begin
u[j]:=;
l[j]:=left[j];
r[j]:=right[j];
end;
ans:=max(ans,(r[j]+l[j]-)*u[j]);
end;
end;
writeln(ans);
end; begin
readln(n,m);
for i:= to n do
for j:= to m do
read(map[i,j]);
work1;
work2;
end.

p.s. 其实看了丽洁姐的代码,发现自己真是傻掉了,两问明明是可以并在一起求得嘛,(r[j]+l[j]-1)、u[j]不就是矩形的长和高,那么两者中肯定存在一个短边构成的正方形……

【以前的空间】bzoj [ZJOI2007]棋盘制作的更多相关文章

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

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

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

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

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

  4. 【BZOJ 1057】 1057: [ZJOI2007]棋盘制作

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

  5. BZOJ 1057:[ZJOI2007]棋盘制作(最大01子矩阵+奇偶性)

    [ZJOI2007]棋盘制作                                          时间限制: 20 Sec 内存限制: 162 MB[题目描述]国际象棋是世界上最古老的博 ...

  6. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

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

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

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

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

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

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

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

随机推荐

  1. React-精华版

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

  2. Qt-QML-Charts-ChartView-编译错误-ASSERT: "!"No style available without QApplication!

    昨天本来是回家想好好琢磨一下使用Chart来绘制曲线的,奈何在建立项目的时候也就卡住了,加上心情比较烦躁,也没有耐心寻找答案就草草了事.所以今天继续搞定这个. 上图是Qt 的编译错误截图 QML de ...

  3. Qt-第一个QML程序-1-项目工程的建立

    这个小程序是我发的第一个完整的QMl程序,这个程序也会持续的更新,一步一步的完善起来,最后会有一个什么样的结果也是不知道,只是把自己目前掌握的QML相关的东西都慢慢的写进来,积累起来 先展示一下运行结 ...

  4. <cerrno>

    文件头名称: <cerrno>(errno.h) 文件头描述: 文件内定义了如下的宏  errno 最后一个错误代码 加上其他至少的三个宏常量:EDOM,ERANGE 和EILSEQ 宏定 ...

  5. 【view】 视图组件说明

    view 是视图容器,可用于包裹其它组件或文本内容. 原型: <view hover-class="[String]" hover-stop-propagation=&quo ...

  6. js屏蔽/过滤 特殊字符,输入就删除掉,实时删除

    1.替换方法: <input type="text" class="domain" onkeyup="this.value=this.value ...

  7. leetcode-组合总数III(回溯)

    组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合.  示例 ...

  8. leetcode-反转链表

      转载至:https://blog.csdn.net/fx677588/article/details/72357389 反转一个单链表.   示例: 输入: 1->2->3->4 ...

  9. 数据库Mysql的学习(八)-储存过程和事务和导入导出

    储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...

  10. ELK部署方法

    最近经理开会说公司要安装ELK日志管理让我们搭建ELK,下面是我搭建步骤和流程,用三台机测试机器搭建的. 软件包我都 给你们放/usr/local/src/elk目录下安装目录都放在/usr/loca ...