我不是题目的说

这道题运用了一种很巧妙的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. Calamari 安装

    在CentOS 7 安装Calamari 2016年04月17日 18:59:06 lizhongwen1987 阅读数 8055更多 分类专栏: Ceph   版权声明:本文为博主原创文章,遵循CC ...

  2. Orleans的深入

    1.序列化  序列化配置有几个坑这里我写出来 2.负载均衡 3.定时器与提醒 4.服务启动执行代码 5.监控 序列化 新建实体类 引用的包 Microsoft.Orleans.Core V2.12 M ...

  3. 基于iCamera测试宽动态全局摄像头mt9v034或mt9v032小结

    基于iCamera测试宽动态全局摄像头mt9v034或mt9v032小结 先看看硬件特点 主要是:全局快门.宽动态 然后看看硬件测试,usb采集出图 再看看寄存器配置 主要测试,可以修改分辨率,修改曝 ...

  4. 小白学 Python 爬虫(20):Xpath 进阶

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. layui扩展组件,下拉树多选

      项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...

  6. 3年Java开发都知道的Redis数据结构和通用命令

    Redis的数据结构 Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景. 五种基础数据结构 String:字符串,是构建其他数据结构的基础 ...

  7. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  8. PyTorch-网络的创建,预训练模型的加载

    本文是PyTorch使用过程中的的一些总结,有以下内容: 构建网络模型的方法 网络层的遍历 各层参数的遍历 模型的保存与加载 从预训练模型为网络参数赋值 主要涉及到以下函数的使用 add_module ...

  9. 简单实现vue列表点击某个高亮显示

    比如ul下有4个li元素. 给每个li绑定点击事件@click="select_li(index),然后这个点击时间会将一个全局变量 selectLi 赋值为 index 的值. 然后在每个 ...

  10. c++-面向对象:类和对象

    类和对象 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string.h> using names ...