数据弱 dp 暴力都能过
dp:
d(i,j,k)表示左上角坐标为(i,j),k为正方形边长
初始化 d(i,j,0)=1 d(i,j,1)=1
如果d(i+1,j+1,k-2)=1,且上下两个外围的相等且回文,左右两个外围的相等且回文;d(i,j,k)=1,否则d(i,j,k)=0
#include <stdio.h>
#include <string.h>
int a[310][310];
bool d[310][310][310];
int check(int x,int y,int l)
{
for(int i=y;i<=y+l-1;i++)
if(a[x][i]!=a[x+l-1][i])return 0;
for(int i=x;i<=x+l-1;i++)
if(a[i][y]!=a[i][y+l-1])return 0;
for(int i=x;i<=x+l/2;i++)
if(a[i][y]!=a[x+l-1-(i-x)][y])return 0;
for(int i=y;i<=y+l/2;i++)
if(a[x][i]!=a[x][y+l-1-(i-y)])return 0;
return 1;
}
int main()
{
int T;
int n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
d[i][j][0]=1;
d[i][j][1]=1;
}
}
int l=n<m?n:m;
int ans=1;
for(int k=2;k<=l;k++)
{
for(int i=1;i<=n;i++)
{
if(i+k-1>n)break;
for(int j=1;j<=m;j++)
{
if(j+k-1>m)break;
if(d[i+1][j+1][k-2]&&check(i,j,k))
{
d[i][j][k]=1;
if(k>ans)ans=k;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}
暴力
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int s[305][305];
int n,m;
int l;
int ans;
void init()
{
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%d",&s[i][j]);
}
}
}
void solve()
{
ans = 1;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(min(n-i,m-j) <= ans)
{
break;
}
l = min(n-i,m-j);
while(l > ans)
{
if(s[i][j]==s[i+l-1][j]&&s[i+l-1][j]==s[i][j+l-1]&&s[i][j+l-1]==s[i+l-1][j+l-1])
{
int q = 0;
for(int k = 1; k * 2 < l; k++)
{
if(s[i+k][j]==s[i+l-1-k][j]&&s[i+l-1-k][j]==s[i+k][j+l-1]&&s[i+k][j+l-1]==s[i+l-1-k][j+l-1])
{
if(s[i][j+k]==s[i+l-1][j+k]&&s[i+l-1][j+k]==s[i][j+l-1-k]&&s[i][j+l-1-k]==s[i+l-1][j+l-1-k])
{
if(s[i+k][j+k]==s[i+l-1-k][j+k]&&s[i+l-1-k][j+k]==s[i+k][j+l-1-k]&&s[i+k][j+l-1-k]==s[i+l-1-k][j+l-1-k])continue;
else
{
q = 1;
break;
}
}
else
{
q = 1;
break;
}
}
else
{
q = 1;
break;
}
for(int c = k - 1; c > 0; c--)
{
if(s[i+k][j+c]==s[i+l-1-k][j+c]&&s[i+l-1-k][j+c]==s[i+k][j+l-1-c]&&s[i+k][j+l-1-c]==s[i+l-1-k][j+l-1-c])
{
if(s[i+c][j+k]==s[i+l-1-c][j+k]&&s[i+l-1-c][j+k]==s[i+c][j+l-1-k]&&s[i+c][j+l-1-k]==s[i+l-1-c][j+l-1-k])
{
continue;
}
else
{
q = 1;
break;
}
}
else
{
q = 1;
break;
}
}
if(q == 1)break;
}
if(q == 0)ans = l;
}
l--;
}
}
}
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
solve();
}
return 0;
}