我的算法很黄很暴力。
符合题目要求的三角形一共有四种形状,对着四种形状分别计算一遍,需要注意的是对于这四个不同的三角形计算的时候遍历的方向是不同的。
wa了十几遍,一直没有发现这个地方写错了,修改后1234msAC。
#include<stdio.h>
#include<string.h>
#define N 505
char map[N][N];
int dp[N][N];
int m,n;
void Init()
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
dp[i][j]=1;
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%s",map[i]+1);
int area,max;
max=1;
Init();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
int x1,y1,x2,y2;
x1=i;y1=j-1;x2=i-1;y2=j;
int temp=1;
while(y1>=1&&x2>=1&&map[x1][y1]==map[x2][y2])
{
y1--;x2--;
temp++;
}
if(i-1>=1&&j-1>=1&&temp-dp[i-1][j-1]>=2) dp[i][j]=dp[i-1][j-1]+2;
else dp[i][j]=temp;
area=dp[i][j]*(dp[i][j]+1)/2;
if(area>max) max=area;;
}
}
Init();
for(int i=1;i<=m;i++)
{
for(int j=n;j>=1;j--)
{
int x1,y1,x2,y2;
x1=i-1;y1=j;x2=i;y2=j+1;
int temp=1;
while(x1>=1&&y2<=n&&map[x1][y1]==map[x2][y2])
{
x1--;y2++;
temp++;
}
if(i-1>=1&&j+1<=n&&temp-dp[i-1][j+1]>=2) dp[i][j]=dp[i-1][j+1]+2;
else dp[i][j]=temp;
area=dp[i][j]*(dp[i][j]+1)/2;
if(area>max) max=area;
}
}
Init();
for(int i=m;i>=1;i--)
{
for(int j=1;j<=n;j++)
{
int x1,y1,x2,y2;
x1=i;y1=j-1;x2=i+1;y2=j;
int temp=1;
while(y1>=1&&x2<=m&&map[x1][y1]==map[x2][y2])
{
y1--;x2++;
temp++;
}
if(i+1<=m&&j-1>=1&&temp-dp[i+1][j-1]>=2) dp[i][j]=dp[i+1][j-1]+2;
else dp[i][j]=temp;
area=dp[i][j]*(dp[i][j]+1)/2;
if(area>max) max=area;
}
}
Init();
for(int i=m;i>=1;i--)
{
for(int j=n;j>=1;j--)
{
int x1,y1,x2,y2;
x1=i+1;y1=j;x2=i;y2=j+1;
int temp=1;
while(x1<=m&&y2<=n&&map[x1][y1]==map[x2][y2])
{
x1++;y2++;
temp++;
}
if(i+1<=m&&j+1<=n&&temp-dp[i+1][j+1]>=2) dp[i][j]=dp[i+1][j+1]+2;
else dp[i][j]=temp;
area=dp[i][j]*(dp[i][j]+1)/2;
if(area>max) max=area;
}
}
printf("%d\n",max);
}
return 0;
}