60tps求助
查看原帖
60tps求助
1041071
ltz761222楼主2024/10/3 18:55

正方形没问题,长方形有问题。 第一次输出之后是求长方形,求每一个节点以最大深度为宽,向两端求长度并相加。

//
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=2e3+10;
int mep[N][N],f[N][N],st[N][N];
int q[N],en;
int n,m,ans;
void add(int w,int dx)
{
	while (st[w][q[en]]>=st[w][dx]&&en)
		q[en--]=0;
	q[++en]=dx;
}
int main ()
{
//	freopen("P1169_4.in","r",stdin);
//	freopen("P1169_4.ans","w",stdout);
	
	scanf ("%d %d",&n,&m);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
		{
			scanf ("%d",&mep[i][j]);
			if ((i+j)%2==1)
				mep[i][j]=(mep[i][j]+1)%2;
		}
	
	for (int i=n;i>=1;i--)
		for (int j=m;j>=1;j--)
			if (mep[i][j]==mep[i+1][j]&&mep[i][j]==mep[i][j+1]&&mep[i][j]==mep[i+1][j+1])
				f[i][j]=min(f[i+1][j+1],min(f[i+1][j],f[i][j+1]))+1,ans=max(ans,f[i][j]);
			else
				f[i][j]=1;
	printf ("%d\n",ans*ans),ans=0;
	
	for (int i=n;i>=1;i--)
		for (int j=1;j<=m;j++)
			if (mep[i][j]==mep[i+1][j])
				st[i][j]=st[i+1][j]+1;
			else
				st[i][j]=1;
	for (int i=1;i<=n;i++)
	{
		while (en)
			q[en--]=0;
		for (int j=1;j<=m;j++)
			add(i,j),f[i][j]=(j-q[en-1]-1)*st[i][j];
	}
	for (int i=1;i<=n;i++)
	{
		q[0]=n+1;
		while (en)
			q[en--]=0;
		for (int j=m;j>=1;j--)
			add(i,j),f[i][j]+=(q[en-1]-j-1)*st[i][j];
	}
	
	ans=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			ans=max(ans,f[i][j]);
	printf ("%d\n",ans);

	return 0;
}

2024/10/3 18:55
加载中...