创意吃鱼法

创意痴愚法

矩阵dp

开4个3000*3000会mle QAQ

分两个方向左上到右下,右上到左下

#include<bits/stdc++.h>
using namespace std;
int a[2700][2700],f[2700][2700],s1[2700][2700],s2[2700][2700];
int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
int main()
{
	int n=read(),m=read();
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	a[i][j]=read();
	int ans=0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		if(a[i][j]) 
		{
			f[i][j]=min(f[i-1][j-1],min(s1[i-1][j],s2[i][j-1]))+1;
			ans=max(ans,f[i][j]);
		}
		else
		{
			s1[i][j]=s1[i-1][j]+1;
			s2[i][j]=s2[i][j-1]+1;
		}
	}
	memset(s1,0,sizeof(s1));
	memset(s2,0,sizeof(s2));
	for(int i=1;i<=n;i++)
	for(int j=m;j>=1;j--)
	{
		if(a[i][j]) 
		{
			f[i][j]=min(f[i-1][j+1],min(s1[i-1][j],s2[i][j+1]))+1;
			ans=max(ans,f[i][j]);
		}
		else
		{
			s1[i][j]=s1[i-1][j]+1;
			s2[i][j]=s2[i][j+1]+1;
		}
	}
	cout<<ans;
	return 0;
}
原文地址:https://www.cnblogs.com/qwq-/p/13920136.html