写一道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. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  2. 前端开发使用Photoshop切图详细步骤

    切图的主要目的是从设计师提供的psd中获取网页制作所要的资源 一.界面设置 1. 新建文件,调整界面大小,背景设置为透明 2. 自动选择,把组切换为图层 3. 添加窗口内容,一共四项:图层.历史纪录. ...

  3. python常用模块之logging模块

    #日志级别 : noset debug info warning error critical #控制台默认的级别是warning的. import logging logging.basicConf ...

  4. percona pt toolkit 总结

    ##=====================================================##pt-osc之工作流程:1.检查更改表是否有主键或唯一索引,是否有触发器2.检查修改表 ...

  5. UNIX高级环境编程(15)进程和内存分配 < 故宫角楼 >

    故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详.   首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表和二叉树)分配额外内 ...

  6. skype客户端搜不到联系人解决办法

    1.确认skype客户端登陆的配置信息 按住Ctrl 键不放,右击右下角任务栏 skype 图标,选择:配置信息,确认skype的:GAL搜索或基于服务器的搜索为:基于服务器的搜索,如下图所示: 2. ...

  7. [luogu P4230]连环病原体

    [luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...

  8. [python][easygui]使用enterbox()方法,简体字会显示成繁体字了

  9. loli的搜索测试-5

    今天早上听说不放假感觉很sad,又听说要考试感觉更sad了,早读的时候Juan_feng表示即使考也不会考虫食算,结果上午并没有考试,就自己做了几道题.不得不说做题的决定实在是太明智了,做NOIP历年 ...

  10. k8s 隔离context+namespace

    kubernetes 最简单的隔离是 应用间使用 namespace进行,对应不同项目,namespace 不同,那么相互调用使用 dns.namespace,而使用 context + namesp ...