[洛谷P1169][题解][ZJOI2007]棋盘制作
这道题运用了一种很巧妙的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]棋盘制作的更多相关文章
- 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作
洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...
- 【洛谷P1169】[ZJOI2007]棋盘制作
棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...
- [洛谷P1169][题解][ZJOI2007]午餐
这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i ...
- DP(悬线法)【P1169】 [ZJOI2007]棋盘制作
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ...
- 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)
次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...
- 洛谷 P1169 [ZJOI2007]棋盘制作
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...
- 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...
- 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)
和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169 p4147 p2701 p1387 #include<cstdio> #include<algorithm& ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
随机推荐
- 使用flink实现一个topN的程序
topN功能是一个非常常见的功能,比如查看最近几分钟的阅读最高数,购买最高数. flink实现topN的功能也非常方便,下面就开始构建一个flink topN的程序. 还是像上篇博客一样,从kafka ...
- unittest自动化测试框架
目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式: unittest构建测试套件(测试用例集合): unittest忽略测试用例: 运行测试集 ...
- visual studio code开发代码片段扩展插件
背景 visual studio code编辑器强大在于可以自己扩展插件,不仅可以去插件市场下载,也可以按照官方的API很方便的制作适合自己的插件: 自己最近在开发一个手机端网站项目,基于vant项目 ...
- ES6,箭头函数 (=>)注意点
函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. 不可以使用arguments对象,该对象在函数体内不存 ...
- oracle 日常巡检
1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
- python学习-while
"""while 条件: 条件满足时,干的事情.如果条件一直满足,一直去重复的执行代码.直接条件不满足为止,停止循环."""# salary ...
- salt python msgpack.exceptions.
msgpack.exceptions.UnpackValueError: 'utf-8' codec can't decode byte 0x82 in position 22: invalid st ...
- NodeJS3-2基础API----Buffer(缓冲器)
Buffer(缓冲器) Buffer是用于处理二进制数据流的 实例类似整数数组,大小固定(实例化之后,是多大就多大,不能进行变更) C++代码在V8 对外分配物理内存 Buffer是全局变量,没必要使 ...
- 运算符副作用总结与例子(js)
js中运算符副作用总结与例子 js中赋值运算符,递增递减运算符,delete运算符具有副作用,简单地说就是前后表达式的值会相互影响,除此之外其它的js运算符都没有副作用. 但函数表达式和对象创建表达式 ...