传送门
首先一个很显然的状态:f[i][j][k][0-2]表示在第i行左边界是j右边界是k,现在在上面/中间/下面的最优解
然后我们大力枚举边界的时间复杂度是O(N^5)
然后我们大力前缀和有话就变成了O(N^3)
uses math;
var
a:array [0..205,0..205] of longint;
f:array [1..3,0..205,0..205,0..205] of longint;
g1,g2:array [0..205,0..205,0..205] of longint;
n,m,i,j,k,l,ans:longint;
begin
read(n,m);
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
for i:=1 to n do
for j:=1 to m do a[i,j]:=a[i,j]+a[i,j-1];
fillchar(f,sizeof(f),192);
fillchar(g1,sizeof(g1),192);
fillchar(g2,sizeof(g2),192);
for i:=1 to n do begin
for j:=1 to m do
for k:=j to m do
if a[i,k]=a[i,j-1] then begin
f[1,i,j,k]:=max(f[1,i-1,j,k],0)+k-j+1;
f[2,i,j,k]:=max(f[2,i-1,j,k],g1[i-1,j-1,k+1])+k-j+1;
f[3,i,j,k]:=max(f[3,i-1,j,k],g2[i-1,j+1,k-1])+k-j+1;
ans:=max(ans,f[3,i,j,k]);
g1[i,j,k]:=f[1,i,j,k]; g2[i,j,k]:=f[2,i,j,k];
end;
for l:=1 to m do
for j:=1 to m-l+1 do g2[i,j,j+l-1]:=max(g2[i,j,j+l-1],max(g2[i,j+1,j+l-1],g2[i,j,j+l-2]));
for l:=m downto 1 do
for j:=1 to m-l+1 do g1[i,j,j+l-1]:=max(g1[i,j,j+l-1],max(g1[i,j-1,j+l-1],g1[i,j,j+l]));
end;
write(ans);
end.