[DP]【最大全零矩阵】【2015.7.9TEST】E

原创 2015年07月10日 14:55:12

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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

最大全1子矩阵 DP

【题意】 给定一个01矩阵,求其最大的全1子矩阵。 【思路】 DP。 【HDU1506】 Problem Address:http://acm.hdu...

HDU 2830 Matrix Swapping II (DP,最大全1矩阵)

题意 给你一个n*m矩阵 每列都可以随便交换位置 求最优交换后最大的全1子矩阵 又是HDU 1505 1506的变种 但这个更容易了 因为每列都可以交换位置了 那么这一行中所有比i高的...

DP 动态规划 Problem E 1005 最大递增子序列

Problem E  ID:1005 简单题意:提供无限个若干种长为xi,宽为yi,高为zi的砖块,砖块可以调整方向(如长也可以为宽或高)。若一个砖块的长和宽分别比另一个砖块的长和宽...

NYOJ104 最大和(dp+求最大子矩阵)

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,...

Q - Phalanx HDU - 2859——基础dp-最大对称子矩阵

Think: 1知识点:基础dp-最大对称子矩阵 2题意:给定一个矩阵,寻找一个最大对称子矩阵,当前题目最大对称子矩阵定义可理解为沿当前子矩阵的次对角线元素对称 3思考:确定动态转移方程的过程可...

dp之最大和,m段最大和以及最大子矩阵

前一段时间因为要讲课学习了dp系列算法,学习了很多东西,给大一菜鸟讲了这个系列的算法,当时没有记录,前几天拿起来发现有点忘记了,所以在这里记录一下,最大和系列算法。 首先子串和 http://acm....

Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)

这题想了好长时间,果断没思路。。于是搜了一下题解。一看题解上的”快速幂”这俩字,不对。。这仨字。。犹如醍醐灌顶啊。。。因为x的范围是10^9,所以当时想的时候果断把dp递推这一方法抛弃了。我怎么就没想...

Codeforces 621E Wet Shark and Blocks【Dp+矩阵快速幂】

E. Wet Shark and Blocks time limit per test 2 seconds memory limit per test 256 megabytes ...

Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo dp+矩阵快速幂

题意:从(0,0)走到(k,0)(1 ≤ k ≤ 1018),每次可以从(x, y) 走到 (x+1, y+1) 或 (x+1, y) 或 (x+1, y-1),然后必须在很多个y == ci的线段下...

Codeforces 514E Darth Vader and Tree【Dp+矩阵快速幂优化】

E. Darth Vader and Tree time limit per test 2 seconds memory limit per test 256 megabytes ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)