using
System;
class
GFG
{
static
void
prefix_calculate(
int
[,] A,
int
[,] row,
int
[,] col)
{
int
n = (
int
)A.GetLength(0);
int
m = (
int
)A.GetLength(1);
for
(
int
i = 0; i < n; ++i)
{
row[i, 0] = A[i, 0];
}
for
(
int
i = 0; i < n; ++i)
{
for
(
int
j = 1; j < m; ++j)
{
row[i, j] = row[i, j - 1]
+ A[i, j];
}
}
for
(
int
i = 0; i < m; ++i)
{
col[0, i] = A[0, i];
}
for
(
int
i = 0; i < m; ++i)
{
for
(
int
j = 1; j < n; ++j)
{
col[j, i] = A[j, i]
+ col[j - 1, i];
}
}
}
static
int
perimeter(
int
i,
int
j,
int
k,
int
[,] row,
int
[,] col,
int
[,] A)
{
int
row_s, col_s;
if
(j == 0)
row_s = 0;
else
row_s = row[i, j - 1];
if
(i == 0)
col_s = 0;
else
col_s = col[i - 1, j];
int
upper_row = row[i, j + k] - row_s;
int
left_col = col[i + k, j] - col_s;
if
(j == 0)
row_s = 0;
else
row_s = row[i + k, j - 1];
if
(i == 0)
col_s = 0;
else
col_s = col[i - 1, j + k];
int
lower_row = row[i + k, j + k] - row_s;
int
right_col = col[i + k, j + k] - col_s;
int
sum = upper_row + lower_row +
left_col + right_col;
sum -= (A[i, j] + A[i + k, j] +
A[i, j + k] + A[i + k, j + k]);
return
sum;
}
static
int
maxPerimeter(
int
[,] A)
{
int
n = (
int
)A.GetLength(0);
int
m = (
int
)A.GetLength(1);
int
[,] row =
new
int
[n, m];
int
[,] col =
new
int
[n, m];
prefix_calculate(A, row, col);
int
maxPer = 0;
for
(
int
i = 0; i < n; ++i)
{
for
(
int
j = 0; j < m; ++j)
{
for
(
int
k = 0; k < Math.Min(n - i, m - j); ++k)
{
int
perimtr = perimeter(i, j, k,
row, col, A);
maxPer = Math.Max(maxPer, perimtr);
}
}
}
return
maxPer;
}
public
static
void
Main(String[] args)
{
int
[,] A = {{ 1, 1, 0 },
{ 1, 1, 1 },
{ 0, 1, 1 }};
Console.Write(maxPerimeter(A));
}
}