E

0.9 seconds, 32 MB

“ 于是乎,你至少证明了你智商比金天成高。也就说你证明了你不是低智儿童,不错不错。

然而这次, 我貌似也卡住了,你给我打下手吧。

勇敢的少年啊快去创造奇迹!”

——-By Doctor Z

貌似 Z 博士正在解析 Zvangelion 初号机的一些问题。 中间遇到了困难。

Zvangelion 初号机有一块 R*S 的电路模块被某种 UMA 感染了。 为了方便我们用整数

描写叙述每一个单元的零件, 即用一个整数矩阵来表示该模块。

这样的 UMA 的习性是,假设一块 N*M 的模块 S 被感染了(N,M>1)。 那么它必定会让第

(1,1)(N,1)(1,M)和(N,M)上的元件保持( 意味着假设该电路被各种修改,都会满足) 以

下关系:( UMA 仅仅会感染至少 2 行且至少 2 列的电路模块)

a[1][1] + a[N][M] ≤a[1][M] + a[N][1]

(注:a[i][j]表示矩阵中第 i 行第 j 列的数值)

然而, 谁说的一块电路不会被反复感染? 当一块电路被反复感染到,随意一个子电路模

块(即矩阵的一个子矩阵所表示的电路)都被感染了。那么这块电路就会发生可怕的事情,

对的, 就是异变!( 正确讲法应该是使徒化)

Z 博士须要知道, 这个 R*S 的电路模块中, 面积最大的有异变( 使徒化) 嫌疑的子电

路模块的面积是多少?

【 输入】

第一行两个正整数 R 和 S(2≤R,S≤1000)。表示 Zvangelion 的电路模块大小。

下接一个 R 行 S 列的矩阵, 用整数来描写叙述电路模块内 R*S 个电路单元上的元件。

描写叙述所用

的整数分布在[-1000000,1000000]内。

【 输出】 面积最大的有异变(使徒化)嫌疑的子电路模块的面积。

假设没有则请输出 0.

【 測试例子】

Input

3 3

1 4 10

5 2 6

11 1 3

Output

9

Input

3 3

1 3 1

2 1 2

1 1 1

Output

4

Input

5 6

1 1 4 0 3 3

4 4 9 7 11 13

-3 -1 4 2 8 11

1 5 9 5 9 10

4 8 10 5 8 8

Output

15

着重解释第二个測试例子。假设整个电路模块都有变异嫌疑,那么要求的是 3*3 的矩

阵 1 个。 2*2 的矩阵共 4 个都满足被感染的条件。

然而观察发现左下角和右上角的 2*2 矩

阵并不满足要求。所以最大的面积既不可能是 9( 3*3),也不可能是 6( 2*3 或 3*2), 然

后左上角的 2*2 矩阵有变异嫌疑。故最大面积为 4( 2*2)。

第三个測试例子的变异模块为

从(3,2)開始一直到( 5,6)结束的子模块。

測试数据范围: 有 60%的数据满足 R、 S≤350

对于感染的条件,我们能够发现一个性质:

a b c

d e f

假设1.a+e<=b+d => a-b<=d-e

2.b+f<=c+e => b-c<=e-f

能够推出a-c<=d-f =>a+f<=c+d

这样一来这道题就能简化成一个求最大全零矩阵的问题。

对于1到r-1,1到s-1的点假设以它为左上方点的2*2矩阵为符合要求。就把这个点标记为0。否则就为1。然后就生成了长r-1,宽s-1的矩阵,答案就是最大的全0矩阵。

#include<cstdio>
#include<cstring>
#define maxl 1001 int r,s,ans=0;
int a[maxl][maxl];
int f[maxl][maxl],h[maxl],l[maxl],rr[maxl]; void prework()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d%d",&r,&s);
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
scanf("%d",&a[i][j]);
} void mainwork()
{
for(int i=1;i<=r-1;i++)
for(int j=1;j<=s-1;j++)
if(a[i][j]+a[i+1][j+1]<=a[i+1][j]+a[i][j+1])
f[i][j]=0;
else
f[i][j]=1;
for(int i=1;i<=r-1;i++)
{
for(int j=1;j<=s-1;j++) //h[j]表示第i行第j列向上有多少个连续的0 ,以下枚举的矩阵就是以h[j]为高度
{
if(f[i][j]==0)
h[j]++;
else
h[j]=0; //这一个是1就不能往下延续长度了
}
for(int j=1;j<=s-1;j++)
{
l[j]=j; //先假设这个高度为h[j]矩阵的左的边就是j
while(l[j]>1 && h[j]<=h[l[j]-1])//假设h[j]是小于h[l[j]-1],l[j]直接拓展到 l[l[j]-1]
l[j]=l[l[j]-1]; //由于l[l[j]-1]是已经拓展过的对l[j]-1来说最左边的边,肯定是已经符合了要求的
}
for(int j=s-1;j>=1;j--) //和拓展左区间一样的做法
{
rr[j]=j;
while(rr[j]<s-1 && h[j]<=h[rr[j]+1])
rr[j]=rr[rr[j]+1];
}
for(int j=1;j<=s-1;j++) //找最大的矩阵。由于这里是缩点缩成的01矩阵,计算面积时长和宽要+1
{
if(ans<(h[j]+1)*(rr[j]-l[j]+2))
ans=(h[j]+1)*(rr[j]-l[j]+2);
}
}
} void print()
{
printf("%d",ans);
} int main()
{
prework();
mainwork();
print();
return 0;
}

[DP]【最大全零矩阵】【2015.7.9TEST】E的更多相关文章

  1. 树形dp|无根树转有根树|2015年蓝桥杯生命之树

    2015年蓝桥杯第十题--生命之树(无根树dfs) ①暴力解法:枚举子集(选点) + dfs判断连通性(题目要求连通)满足上面两个条件下找出最大值权值和 ②dfs无根树转有根树,递归找最优 先学习无根 ...

  2. hdu 5492 Find a path(dp+少量数学)2015 ACM/ICPC Asia Regional Hefei Online

    题意: 给出一个n*m的地图,要求从左上角(0, 0)走到右下角(n-1, m-1). 地图中每个格子中有一个值.然后根据这些值求出一个最小值. 这个最小值要这么求—— 这是我们从起点走到终点的路径, ...

  3. 繁华模拟赛 David与Vincent的博弈游戏

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  4. CSP2019知识点整理

    也算是接下来二十天的复习计划吧 仅止于联赛难度左右 基础算法 字符串 char[] cstring memset() 输入无& gets(), fgets(stdin, ,); strcmp, ...

  5. 2015暑假多校联合---Expression(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5396 Problem Description Teacher Mai has n numb ...

  6. 2015多校.Zero Escape (dp减枝 && 滚动数组)

    Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  7. Codeforces Good bye 2015 B. New Year and Old Property dfs 数位DP

    B. New Year and Old Property 题目连接: http://www.codeforces.com/contest/611/problem/B Description The y ...

  8. 2015最流行的Android组件、工具、框架大全(转)

    转自:2015最流行的Android组件.工具.框架大全 Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生 ...

  9. HDU 5534/ 2015长春区域H.Partial Tree DP

    Partial Tree Problem Description In mathematics, and more specifically in graph theory, a tree is an ...

随机推荐

  1. 常见的C字符串处理函数的源代码

    #include <stdio.h> #include <assert.h> char *strcpy(char *strDest,const char *strSrc) // ...

  2. HTTP协议学习,post于get;用Fiddler测试请求

    转载 收藏于网络 1.简介: HTTP协议:Hypertext transfer protocol 超文本 传输 协议 它是TCP/IP协议集中的一个运用层协议. 用于定义WEB浏览器和WEB服务器之 ...

  3. apache-maven-3.0.4-bin.zip

    http://zhidao.baidu.com/share/2a8974fd1546ef5f11ad9cccb3cabf88.html apache-maven-3.0.4-bin.zip

  4. JS对浏览器Cookie的操作,查询、设置以及删除

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  5. tensorflow学习之路---解决过拟合

    ''' 思路:1.调用数据集 2.定义用来实现神经元功能的函数(包括解决过拟合) 3.定义输入和输出的数据4.定义隐藏层(函数)和输出层(函数) 5.分析误差和优化数据(改变权重)6.执行神经网络 ' ...

  6. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码

    随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...

  7. Python基本循环实例Day 1

    输入正确的用户名和密码,显示登陆界面,超过三次输入错误则锁定,定义字符串记得加上单引号,数字可以int定义,while循环和if循环语句后加上:,break不加: print("------ ...

  8. [React] Controlling Form Values with React

    In this lesson we'll talk about controlling the value for inputs, textareas, and select elements. We ...

  9. JavaScript数组的某些操作(二)

    7.颠倒数组中元素的顺序(注意:不是为数组排序)--reverse方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  10. [ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

    作为入门者来说.了解JavaScript中timer的工作方式是非常重要的.通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. ...