[codevs1159]最大全零子矩阵
来源:互联网 发布:动漫咨询的软件 编辑:程序博客网 时间:2024/06/05 16:54
传送门←
先DP处理出每点向上最多扩展出的0的个数
再用二维单调栈处理最大矩形
其实就是对每一行跑一遍单调栈……
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<stack>using namespace std;const int MAXN = 2000 + 50;int map[MAXN][MAXN],f[MAXN][MAXN],dp[MAXN][MAXN];int n,ans;struct zt{ int h,l,w;};stack <zt> q;void solve(int k){ for(int i = 1;i <= n;i ++) { int h = dp[k][i]; if(!q.empty()) { zt u = q.top(); zt p = u; if(u.h < h) { q.push((zt){h,i,i - p.l});// continue; } while(u.h >= h) { q.pop(); ans = max(ans,max(u.h * (i - u.l + u.w - 1),h * (i - u.l + u.w)));// if(q.empty()) { ans = max(ans,h * (i - u.l + u.w)); break; } p = u; u = q.top(); } q.push((zt){h,i,i - p.l + p.w}); } else q.push((zt){h,i,1}); ans = max(ans,h); } while(!q.empty()) { zt u = q.top(); q.pop(); if(q.empty()) { ans = max(ans,u.h * u.w); return; } zt x = q.top(); ans = max(ans,x.h * (u.l - x.l + x.w)); }}int main(){ scanf("%d",&n); for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) scanf("%d",&map[i][j]); for(int i = 1;i <= n;i ++) { for(int j = 1;j <= n;j ++) dp[j][i] = !map[j][i] * (dp[j - 1][i] + 1); } for(int i = 1;i <= n;i ++) { solve(i); } printf("%d",ans);}
tips:
1、明确宽度是否包括端点
2、宽度标志着该元素栈前元素实际位置→该元素位置,就是包括所有该元素前因不满足单调性而被弹出的元素宽度(栈为单调递增栈,故前面不满足弹出的元素一定是高度大了的,所以一定可以按照当前高度计算为矩形);
3、思路要清楚……至少要想清楚自己在打什么……OTZ
阅读全文
1 0
- [codevs1159]最大全零子矩阵
- [codevs1159]最大全0子矩阵
- 【codevs1159】最大全0子矩阵
- [codevs1159]最大全0子矩阵(极大子矩阵)
- [CODEVS1159]最大全0子矩阵解题报告
- 【codevs1159】最大全0子矩阵(悬线法)
- 最大全零子矩阵
- 最大矩阵
- 最大子矩阵问题
- 矩阵最大 max sum
- 最大子矩阵模板
- 最大子矩阵问题
- 最大子矩阵问题
- 最大01 子矩阵
- 最大子矩阵问题
- 最大子矩阵
- 最大子矩阵问题
- 最大子矩阵和
- CommonsMultipartResolver进行文件上传
- 滚动到锚点
- c++操作excel表格通过身份证号计算年龄
- elasticsearch 2.4.6 集群+kibana 4.6安装部署学习记录
- 题目171:聪明的kk
- [codevs1159]最大全零子矩阵
- 区块宝创始人兼CEO范李悦受邀参加36氪WISE×新金融行业峰会
- 每日区块链:日本风投公司Global Brain成立区块链分支机构;日本将区块链技术用于能源管理
- Android自定义Zxing扫一扫
- 欢迎使用CSDN-markdown编辑器
- 各种工具安装步骤大全
- 每日区块链:充分利用区块链技术的四个行业;区块链普惠项目将引发金融变革
- 每日区块链:日立与瑞穗达成合作开发区块链供应链;区块链技术将在医疗行业面临不小挑战 患者信息安全成关注点
- ►奇说总001期:《“中本聪”,你去哪儿了?》0928