周子衡 @ 2019-02-10 16:52:46
莫名
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int mp[2501][2501]={};
int l[2501][2501],r[2510][2510],u[2501][2501]/*,d[2510][2510]*/;
//l[i][j]:how many 0 together in the left of (i,j) excluding itself
int dp1[2501][2501],dp2[2501][2501];
int main()
{
int i,j;
int n=0,m=0;scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&mp[i][j]);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)l[i][j]=mp[i][j-1]?0:l[i][j-1]+1,u[i][j]=mp[i-1][j]?0:u[i-1][j]+1;
for(i=n;i>=1;i--)for(j=m;j>=1;j--)r[i][j]=mp[i][j+1]?0:r[i][j+1]+1/*,d[i][j]=mp[i+1][j]?0:d[i+1][j]+1*/;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)dp1[i][j]=mp[i][j]?min(min(l[i][j],u[i][j]),dp1[i-1][j-1])+1:0;
for(i=1;i<=n;i++)for(j=m;j>=1;j--)dp2[i][j]=mp[i][j]?min(min(r[i][j],u[i][j]),dp2[i-1][j+1])+1:0;
int maxn=0;for(i=1;i<=n;i++)for(j=1;j<=m;j++)maxn=max(maxn,dp1[i][j]),maxn=max(maxn,dp2[i][j]);
printf("%d",maxn);return 0;
}
评测记录
by yurzhang @ 2019-02-10 16:55:01
怎么莫名了。。你开了143MB的数组欸兄dei
by LightningUZ @ 2019-02-10 17:06:14
可是他并没有开动态的空间啊……为什么只MLE了一个点,而其他的点过了?
by yurzhang @ 2019-02-10 17:08:53
可能是只算用掉的空间吧
by 周子衡 @ 2019-02-10 17:14:47
@yurzhang @LightningUZ 过了……
by 周子衡 @ 2019-02-10 17:15:35
用了面向数据滚动数组优化一下就过了