using
System;
public
class
GFG {
static
int
R = 5;
static
int
C = 3;
static
void
precompute(
int
[,]mat,
int
[,]ryt,
int
[,]dwn) {
for
(
int
j = C - 1; j >= 0; j--) {
for
(
int
i = 0; i < R; ++i) {
if
(mat[i,j] == 0) {
ryt[i,j] = 0;
}
else
{
ryt[i,j] = ryt[i,j + 1] + 1;
}
}
}
for
(
int
i = R - 1; i >= 0; i--) {
for
(
int
j = 0; j < C; ++j) {
if
(mat[i,j] == 0) {
dwn[i,j] = 0;
}
else
{
dwn[i,j] = dwn[i + 1,j] + 1;
}
}
}
}
static
int
solveRowSwap(
int
[,]ryt) {
int
[]b =
new
int
[R];
int
ans = 0;
for
(
int
j = 0; j < C; j++) {
for
(
int
i = 0; i < R; i++) {
b[i] = ryt[i,j];
}
Array.Sort(b);
for
(
int
i = 0; i < R; ++i) {
ans = Math.Max(ans, b[i] * (R - i));
}
}
return
ans;
}
static
int
solveColumnSwap(
int
[,]dwn) {
int
[]b =
new
int
[C];
int
ans = 0;
for
(
int
i = 0; i < R; ++i) {
for
(
int
j = 0; j < C; ++j) {
b[j] = dwn[i,j];
}
Array.Sort(b);
for
(
int
k = 0; k < C; ++k) {
ans = Math.Max(ans, b[k] * (C - k));
}
}
return
ans;
}
static
void
findMax1s(
int
[,]mat) {
int
[,]ryt =
new
int
[R + 2,C + 2];
int
[,]dwn =
new
int
[R + 2,C + 2];
precompute(mat, ryt, dwn);
int
rswap = solveRowSwap(ryt);
int
cswap = solveColumnSwap(dwn);
if
(rswap > cswap) {
Console.WriteLine(
"Row Swap\n"
+ rswap);
}
else
{
Console.WriteLine(
"Column Swap\n"
+ cswap);
}
}
public
static
void
Main() {
int
[,]mat = {{0, 0, 0},
{1, 1, 0},
{1, 1, 0},
{0, 0, 0},
{1, 1, 0}};
findMax1s(mat);
}
}