using
System;
class
GFG{
static
int
maxSubMatSum(
int
[,]mat)
{
int
n = mat.GetLength(0);
int
m = mat.GetLength(1);
int
i, j;
int
[,]dp =
new
int
[n, m];
dp[n - 1, m - 1] = mat[n - 1, m - 1];
int
res = dp[n - 1, m - 1];
for
(i = m - 2; i >= 0; i--)
{
dp[n - 1, i] = mat[n - 1, i] +
dp[n - 1, i + 1];
res = Math.Max(res, dp[n - 1,i]);
}
for
(i = n - 2; i >= 0; i--)
{
dp[i, m - 1] = mat[i, m - 1] +
dp[i + 1, m - 1];
res = Math.Max(res, dp[i, m - 1]);
}
for
(i = n - 2; i >= 0; i--)
{
for
(j = m - 2; j >= 0; j--)
{
dp[i, j] = mat[i, j] + dp[i, j + 1] +
dp[i + 1, j] - dp[i + 1, j + 1];
res = Math.Max(res, dp[i, j]);
}
}
return
res;
}
public
static
void
Main(String[] args)
{
int
[,]mat= {{ -6, -4, -1 },
{ -3, 2, 4 },
{ 2, 5, 8 } };
Console.Write(maxSubMatSum(mat));
}
}