HihoCoder1664 01间隔方阵([Offer收割]编程练习赛40)(DP)

Posted ---学习ing---

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HihoCoder1664 01间隔方阵([Offer收割]编程练习赛40)(DP)相关的知识,希望对你有一定的参考价值。

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个NxM的01矩阵,小Hi希望从中找到一个01间隔的子方阵,并且方阵的边长越大越好。  

例如对于

0100100
1000101
0101010
1010101
0101010

在右下角有一个4x4的01间隔方阵。

输入

第一行包含两个整数N和M。  

以下N行M列包含一个NxM的01矩阵。

对于30%的数据,1 ≤ N, M ≤ 250

对于100%的数据,1 ≤ N, M ≤ 1000

输出

输出最大的01间隔方阵的边长。

样例输入
5 7  
0100100
1000101
0101010
1010101
0101010
样例输出
4
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1010;
char c[maxn][maxn];
int L[maxn][maxn],H[maxn][maxn];
int a[maxn][maxn];
int main()
{
    int n,m,i,j,ans=0,pos1,pos2;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++) scanf("%s",c[i]+1);
    for(i=1;i<=n;i++) L[i][1]=1;
    for(i=1;i<=m;i++) H[1][i]=1;
    for(i=1;i<=n;i++)
      for(j=2;j<=m;j++)
        L[i][j]=c[i][j]==c[i][j-1]?1:L[i][j-1]+1;
    for(i=1;i<=m;i++)
      for(j=2;j<=n;j++)
        H[j][i]=c[j][i]==c[j-1][i]?1:H[j-1][i]+1;
    for(i=1;i<=n;i++) 
     for(j=1;j<=m;j++){
         if(i==1||j==1||c[i][j]!=c[i-1][j-1])a[i][j]=1;
         else {
            a[i][j]=min(a[i-1][j-1]+1,L[i][j]);
            a[i][j]=min(a[i][j],H[i][j]);
         }
         if(a[i][j]>ans) ans=a[i][j],pos1=i,pos2=j;
     }
    printf("%d\n",ans);
    return 0;
}

 

以上是关于HihoCoder1664 01间隔方阵([Offer收割]编程练习赛40)(DP)的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder 1664

HihoCoder1673 : 01间隔矩阵([Offer收割]编程练习赛41)(单调队列)

HihoCoder - 1673 (单调队列)

hihoCoder挑战赛1 毁灭者问题

对具有重叠事件的稀疏时间序列数据的时间间隔求和

DB2 SQL查找与其他行间隔为1分钟的行