题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909

题意:给出两个矩阵A和B,找出最大的相同子矩阵S。输出S的高和宽以及在A和B中的位置。

思路:1、利用偏移量,其实就是枚举第二个矩阵跟第一个矩阵的那个位置开始对齐。再明白一点,就是,首先枚举B的(0,0)与A的哪个位置对齐;然后,枚举A的(0,0)与B的哪个位置对齐。这两个可以合并起来,偏移量范围为(-n2,-m2)-(n1,m1)。

2、然后就可以直接比较出对应位置的是不是相同。得到一个n2*m2的g矩阵,g[i][j]为0或者1。然后我们就是找这个g中最大的只包含1的子矩阵。我们一行一行处理,对于某一行i的某列j,我们用h[j]记录这列向上可匹配的长度,就是当前行的j列向上有连续的h[j]个1。然后,我们用l[j]和r[j]记录j列最左和最右匹配的长度。我们只需要从左向右扫描一遍就可求出l[i];然后从右向左扫描一遍就可求出r[j]数组。比如我们以计算l[j]为例。(1)对于当前的j,若j=0或者h[j-1]=0,那么left=j(left是一个临时变量);(2)若i=0(第一行)或者g[i-1][j]=0(上面一行为0),那么l[j]=left,因为这个l[j]是每行重复使用的,前面可能l[j]是记录的别的值,但是现在必须要置为当前的left,因为i=0和g[i-1][j]=0都等同于这是新的一行开始;(2)若left>l[j],l[j]=left。

3、从2的最后一句看出这个貌似是以h优先的。不妨设g的一种情况为

0 1 2 3 (列号)

0 0 1 1

1 1 1 1

1 1 1 1

显然最大是8.那么现在呢?我们转移完第一行后第二列的l为2,我们在2的最后一句是若left>l[j],l[j]=left。但是到达第二行是l[2]=0对吧,但是没有转移。此时求出的是6。但是这个程序并没有错。因为总有一个偏移量我们能够得到这个:

0 1 2 3 (列号)

1 1 1 1

1 1 1 1

此时就得到了8。所以,其实在一次中是以列优先的,也就是h。但是这并不会导致正确结果丢失,因为我们枚举的偏移量会覆盖每种情况。

int n1,m1,n2,m2;
char a[N][N],b[N][N];
int h[N],r[N],l[N],g[N][N];
int Max,X1,Y1,X2,Y2,rr,cc;

void deal(int ax,int ay)
{
    if(ax+n2<0||ay+m2<0) return; 
    clr(h,0);
    int i,j,k,left,right,n=n2,m=m2;
    FOR0(i,n) FOR0(j,m)
    {
        if(a[i+ax+50][j+ay+50]==b[i][j]) g[i][j]=1;
        else g[i][j]=0;
    }
    FOR0(i,n)
    {
        FOR0(j,m) g[i][j]?h[j]++:h[j]=0;
        FOR0(j,m) if(h[j])
        {
            if(!j||!h[j-1]) left=j;
            if(!i||!g[i-1][j]) l[j]=left;
            if(left>l[j]) l[j]=left;
        }
        FORL0(j,m-1) if(h[j])
        {
            if(j==m-1||!h[j+1]) right=j;
            if(!i||!g[i-1][j]) r[j]=right;
            if(right<r[j]) r[j]=right;
        }
        FOR0(j,m) if((r[j]-l[j]+1)*h[j]>Max)
        {
            Max=(r[j]-l[j]+1)*h[j];
            rr=h[j];
            cc=r[j]-l[j]+1;
            X1=i-h[j]+ax+1;
            Y1=l[j]+ay;
            X2=i-h[j]+1;
            Y2=l[j];
        }
    }
}

int main()
{
    Rush(n1)
    {
        RD(m1);
        int i,j;
        clr(a,0);
        for(i=50;i<n1+50;i++) RD(a[i]+50);
        RD(n2,m2);
        FOR0(i,n2) RD(b[i]);
        Max=0;
        for(i=-n2;i<n1;i++) for(j=-m2;j<m1;j++)
        {
            deal(i,j);
        }
        if(!Max) puts("0 0");
        else PR(rr,cc),PR(X1+1,Y1+1),PR(X2+1,Y2+1);
    }
    return 0;
}

ZOJ 3367 Counterfeit Money(最大相同子矩阵)的更多相关文章

  1. ZOJ 1074 最大子矩阵和

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  2. ZOJ 1074 To the Max(DP 最大子矩阵和)

    To the Max Time Limit: 2 Seconds      Memory Limit: 65536 KB Problem Given a two-dimensional array o ...

  3. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  4. ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)

    [热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...

  5. ZOJ 1859 Matrix Searching(二维线段树)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...

  6. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

  7. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  8. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  9. [BZOJ1127][POI2008] KUP子矩阵

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

随机推荐

  1. 剑指offer--7题

    *题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. *句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. *例如输入“I am a student.”,则输出“st ...

  2. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

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

  3. 扫描二维码跳转app

    1.判断是否安装了app <html> <head> <meta name="viewport" content="width=device ...

  4. CSS自定义文件上传按钮

    今天一同事问我文件上传按钮的问题,情况是这样的,他页面上有3个按钮,分为左中右三个,左边的位按钮甲,右边的位按钮乙,而中间的就是个文件选择按钮,情况大概是这个样子的: 两边的按钮都有了样式,但中间的选 ...

  5. 机器学习在 IT 运维管理中的必要性!

    机器学习技术在监控工具中的应用已经成为 IT 运维与 DevOps 团队的一大热点话题.尽管相关的使用案例很多,对 IT 团队而已真正的「杀手级应用」是机器学习如何提高实时事件管理能力,从而帮助较大规 ...

  6. 服务接口API限流 Rate Limit 续

    一.前言 上一篇文章中粗浅的介绍使用Redis和基于令牌桶算法进行对服务接口API限流,本文介绍另一种算法---漏桶算法的应用.Nginx想必大家都有所了解是一个高性能的 HTTP 和反向代理服务器, ...

  7. uva 10564

    Problem FPaths through the HourglassInput: Standard Input Output: Standard Output Time Limit: 2 Seco ...

  8. 2015年4月 15款免费jQuery插件

    点这里 We have collected for you the 15 fresh, free and handy jQuery plugins that will help to speed up ...

  9. mvc5 知识点01

    1.ViewBag 动态数据类型,也就是说可以随便指定属性,前后台传值很是有用 2.Layout 属性,定义模版,模版中一般用@RenderBody() 做占位符,用于放置子页面内容 3.@model ...

  10. 数据库中已存在名为 'View_Business' 的对象。

    用EF框架+MCF,编译的时候出现:数据库中已存在名为 'View_Business' 的对象. 解决方案: 1.Enable-Migrations2.Add-Migration3.Update-Da ...