博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1169 [ZJOI2007]棋盘制作
阅读量:6081 次
发布时间:2019-06-20

本文共 1466 字,大约阅读时间需要 4 分钟。

随手一写就冲进了最优解的第一页?

本来以为是dp, 但是经过仔细分析...这不就是二进制 + 单调栈么?

然后想正方形的情况...emm..好像正方形一定是最大矩形的子矩阵吧!

听说此题dp也可行?

#include 
#include
#include
#include
#include
using namespace std;typedef pair
P;const int MAXN = 2e3 + 20;const int INF = 0x3f3f3f3f;inline int read(){ int x = 0; char ch = getchar(); while(!isdigit(ch)) ch = getchar(); while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x;}int N, M;int sum[2][MAXN];bool map[2][MAXN];P ans(1, 1);struct Sta{ stack

sta; void init(){ pushin(0); while(!sta.empty()) sta.pop(); return ; } void pushin(int h){ if(sta.empty() || sta.top().first < h) { sta.push(P(h, 1)); return ; } int len = 0, hei = INF; while(!sta.empty() && sta.top().first > h) { P p = sta.top(); sta.pop(); len += p.second; hei = min(hei, p.first); ans.first = max(ans.first, len * p.first); ans.second = max(ans.second, min(len, hei) * min(len, hei)); } sta.push(P(h, len + 1)); return; }}S;int main(){ cin>>N>>M; int d = 0; for(int i = 1; i <= N; i++){ d ^= 1; if(i == 1) { for(int j = 1; j <= M; j++) sum[d][j] = 1, map[d][j] = read(); continue; } for(int j = 1; j <= M; j++){ map[d][j] = read(); sum[d][j] = (map[d ^ 1][j] ^ map[d][j]) ? sum[d ^ 1][j] + 1 : 1; if(j - 1 && map[d][j] ^ map[d][j - 1]) S.pushin(sum[d][j]); else S.init(), S.pushin(sum[d][j]); } S.init(); } cout<

<

 

 

 

转载于:https://www.cnblogs.com/wsmrxc/p/9309700.html

你可能感兴趣的文章
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
Q85 最大矩形
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>