写一道CODEVS的题目

其实我还是很喜欢CODEVS的界面的

主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法

对于一些详细的东西参考dalao's blog,不喜勿喷

对于悬线法,其实是用来求二维平面内的最大(或者是其他)要求的子矩形的面积。其中的子矩形要满足以下两点性质:

  1. 子矩形的边要平行于大矩形的边,就是不能斜着

  2. 子矩形一定要满足某些性质,如本题中的全部为0

这时候我们可以用O(nm)的悬线法来solve这种问题

其实我们要做的就是DP出三个数组:

  • h[i][j]:表示第i行第j列向上包括自身最多一共有几个连续的0

  • l[i][j]:表示第i行第j列在保持以上的情况中,向左边(包括自身)最窄的宽度

  • r[i][j]:同上,只不过是向右的而已

所以,我们可以很轻易的得到:

ans=max(ans,(h[i][j]+l[i][j]-1)*h[i][j])

所以我们只需要处理处h,l,r数组即可

这里的转移很简单也很显然,自己看一下CODE中的转移即可

CODE

#include<cstdio>
using namespace std;
const int N=2005;
int h[N][N],l[N][N],r[N][N],a[N][N],n,ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
register int i,j;
for (read(n),i=1;i<=n;++i)
{
for (j=1;j<=n;++j)
{
read(a[i][j]);
if (i!=1) h[i][j]=a[i-1][j]?!a[i][j]:h[i-1][j]+!a[i][j]; else h[i][j]=!a[i][j];
l[i][j]=a[i][j-1]?1:l[i][j-1]+1;
}
for (j=n;j>=1;--j)
r[i][j]=a[i][j+1]?1:r[i][j+1]+1;
}
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
if (!a[i][j])
{
if (i!=1&&!a[i-1][j]) l[i][j]=min(l[i][j],l[i-1][j]),r[i][j]=min(r[i][j],r[i-1][j]);
ans=max(ans,(r[i][j]+l[i][j]-1)*h[i][j]);
} else h[i][j]=l[i][j]=r[i][j]=0;
printf("%d",ans);
return 0;
}

CODE[VS] 1159 最大全0子矩阵的更多相关文章

  1. Codevs 1159 最大全0子矩阵 悬线法!!!!

    1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O ...

  2. Codevs 1159 最大全0子矩阵

    1159 最大全0子矩阵  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 在一个0,1方阵中找出其中最大的全 ...

  3. [codevs1159]最大全0子矩阵(悬线法)

    解题关键:悬线法模板题.注意此模板用到了滚动数组. #include<cstdio> #include<cstring> #include<algorithm> # ...

  4. VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用

    一.项目需求 最近公司有终端桌面系统需求,需要支持本地离线运行(本地数据为主,云端数据同步),同时支持Window XP,最好跨平台.要求安装配置简单(一次性打包安装),安装包要小,安装时间短,可离线 ...

  5. QR code & auto login & OAuth 2.0

    QR code & auto login & OAuth 2.0 扫码自动登录原理解析 https://www.ximalaya.com/shangye/14685881/958686 ...

  6. Error Code: 1366. Incorrect DECIMAL value: '0' for column '' at row -1 0.266 sec;

    Reference: https://stackoverflow.com/questions/35037288/incorrect-decimal-integer-value-mysql     Er ...

  7. Visual Studio Code预览版Ver 0.3.0试用体验

    当你开始阅读这篇文章时,请先不要把Visual Studio Code和.net.Windows联想到一起,因为VS Code是一个跨平台,支持30多种语言的开箱代码编辑器.不管你是.Net.Java ...

  8. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一

    好吧,现在我们假设你已经安装好了VS Code开发工具..Net Core 2.0预览版的SDK dotnet-sdk-2.0.0(注意自己的操作系统),并且已经为VS Code安装好了C#扩展(在V ...

  9. poj3494Largest Submatrix of All 1’s(最大全1子矩阵)

    题目链接:http://poj.org/problem?id=3494 题目大意: 出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的. ...

随机推荐

  1. flutter 监控返回键

    return new WillPopScope( child: Scaffold( body: new Center( child: new Column( children: <Widget& ...

  2. [Swift] Swift笔记

    开始整理Swift笔记了.打算直接用Playground去写,里面自带的Markup语法和Markdown差不多,显示的效果也不差于博客.而且用Xcode看代码也方便.所以这部分内容不再在博客里记录了 ...

  3. Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具

    Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具 A simple CLI for scaffolding React.js ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  5. MySQL 性能监控4大指标——第二部分

    [编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的4大指标. 第一部分介绍了前两个指标:查询吞吐量与查询执行性能.本文将继续介绍另两个指标:MySQL 连接与缓冲池 ...

  6. Leetcode题解之Valid Palindrome II

    1.题目描述 2.问题分析 使用两个下标,检测下标对应的字符是否相等,若不相等,则考察子串. 3.代码 bool validPalindrome(string s) { , j = s.size()- ...

  7. postgresql 获取所有表名、字段名、字段类型、注释

    获取表名及注释: select relname as tabname,cast(obj_description(relfilenode,'pg_class') as varchar) as comme ...

  8. 第四次作业 重写equals方法

    使用上几次用到得User实体类,在其中重写equals方法. @Override public boolean equals(Object obj) { if(obj==null)return fal ...

  9. Kafka学习之路 (三)Kafka的高可用

    一.高可用的由来 1.1 为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消费, ...

  10. ubuntu 中安装 ZED SDK 及结合ROS 的使用

    双目视觉(stereo vision),由于估计深度相对容易且稠密,在姿态估计和建图时容易初始化和估计尺度,所以在三维重建,SLAM等的应用中有这广泛的应用. ZED 作为近几年出现的商业化双目传感器 ...