我不是题目的说

这道题运用了一种很巧妙的DP方式:悬线法

如图,蓝色为悬线,黄色为向两边延伸的长度

那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略)

所以我们可以维护三个数组:

Up[i][j]表示向上延伸的长度

Left[i][j]表示向左能延伸到的最远横坐标

Right[i][j]表示向右能延伸到的最远横坐标

Code:

 #include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,maxRec,maxSqr;
int mp[][];
int Up[][];
int Left[][];
int Right[][];
inline void Init(){
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>mp[i][j];
//预处理一:没啥可说的
Left[i][j]=Right[i][j]=j;
Up[i][j]=;
}
}
//预处理二:处理边界
for(int i=;i<=n+;i++)mp[i][]=mp[i][m+]=INF;
for(int j=;j<=m+;j++)mp[][j]=mp[n+][]=INF;
//预处理三:预处理Left、Right数组(黄线)
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]!=mp[i][j-]){
Left[i][j]=Left[i][j-];
}
}
}
for(int i=;i<=n;i++){
for(int j=m-;j>=;j--){
if(mp[i][j]!=mp[i][j+]){
Right[i][j]=Right[i][j+];
}
}
}
}
inline void DP(){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
//更新
if(i>&&mp[i][j]!=mp[i-][j]){
Up[i][j]=Up[i-][j]+;
//注意这里存的是坐标所以Left取max而Right取min
Left[i][j]=max(Left[i][j],Left[i-][j]);
Right[i][j]=min(Right[i][j],Right[i-][j]);
}
//统计矩形,正方形同理
int dis=Right[i][j]-Left[i][j]+;
maxRec=max(maxRec,Up[i][j]*dis);
maxSqr=max(maxSqr,min(Up[i][j],dis)*min(Up[i][j],dis));
}
}
cout<<maxSqr<<endl<<maxRec<<endl;
}
int main(){
Init();
DP();
return ;
}

[洛谷P1169][题解][ZJOI2007]棋盘制作的更多相关文章

  1. 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作

    洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...

  2. 【洛谷P1169】[ZJOI2007]棋盘制作

    棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...

  3. [洛谷P1169][题解][ZJOI2007]午餐

    这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i ...

  4. DP(悬线法)【P1169】 [ZJOI2007]棋盘制作

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ...

  5. 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)

    次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...

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

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

  7. 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划

    P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...

  8. 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)

    和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169  p4147  p2701  p1387 #include<cstdio> #include<algorithm& ...

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

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

随机推荐

  1. ARTS-S govendor

    govendor init govendor add +external

  2. latex常用技巧

    画表格 \usepackage{multirow} \begin{tabular}{cccc} \hline \multicolumn{4}{c}{学生信息}\\ \hline 班级& 姓名& ...

  3. 联合查询和数据库设计e-r图

    联合查询: 联合查询的关键字是: union 基本含义 联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”. 两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等. 就 ...

  4. Python3 并发编程1

    目录 操作系统发展 穿孔卡片 批处理 多道技术(单核) 并发与并行 进程 程序与进程 进程调度 进程的三个状态 同步和异步 阻塞与非阻塞 僵尸进程与孤儿进程 守护进程 Python中的进程操作 Pro ...

  5. 【重温基础】JS中的常用高阶函数介绍

    Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以 ...

  6. python学习-继承

    # 继承# 你的是我的,我的还是我的 class Animal: def __init__(self,name,private_v1): self.name = name self._private_ ...

  7. Educational Codeforces Round 78 (Rated for Div. 2)

    A题 给出n对串,求s1,是否为s2一段连续子串的重排,串长度只有100,从第一个字符开始枚举,sort之后比较一遍就可以了: char s1[200],s2[200],s3[200]; int ma ...

  8. MySql数据库之常用数据类型及常用约束简述

    本文呢,主要给大家简述一下数据库中常用的几种数据类型以及约束. 1.数据类型 数据类型,是指数据表中可以存储的数据的种类. 数据库中常用的数据类型有: 1.整型:int.bit 2.小数:decima ...

  9. Yii2 框架整体结构

    Yii2框架是一个非常庞大但是并不臃肿的 php 框架.使用 Yii2 框架,可以极大的提升开发效率. 秉持着要知其然也要知其所以然的思想,花了一周的时间,看了 linuor 的 <深入理解Yi ...

  10. Android 上下文菜单 ActionMode

    public class MainActivity extends Activity { private Button button; private ActionMode actionMode; @ ...