using
System;
class
GFG
{
static
int
MAXI = 50 ;
static
int
[,,]dp =
new
int
[MAXI, MAXI,
MAXI * MAXI];
static
int
n, m;
static
int
INT_MAX =
int
.MaxValue;
static
int
minDifference(
int
x,
int
y,
int
k,
int
[,]b,
int
[,]c)
{
int
diff = 0;
if
(x >= n || y >= m)
return
INT_MAX;
if
(x == n - 1 && y == m - 1)
{
diff = b[x, y] - c[x, y];
return
Math.Min(Math.Abs(k - diff),
Math.Abs(k + diff));
}
int
ans = dp[x, y, k];
if
(ans != -1)
return
ans;
ans = INT_MAX;
diff = b[x, y] - c[x, y];
ans = Math.Min(ans, minDifference(x + 1, y,
Math.Abs(k + diff), b, c));
ans = Math.Min(ans, minDifference(x, y + 1,
Math.Abs(k + diff), b, c));
ans = Math.Min(ans, minDifference(x + 1, y,
Math.Abs(k - diff), b, c));
ans = Math.Min(ans, minDifference(x, y + 1,
Math.Abs(k - diff), b, c));
return
ans;
}
public
static
void
Main ()
{
n = 2; m = 2;
int
[,]b = { { 1, 4 }, { 2, 4 } };
int
[,]c = { { 3, 2 }, { 3, 1 } };
for
(
int
i = 0; i < MAXI; i++)
{
for
(
int
j = 0; j < MAXI; j++)
{
for
(
int
k = 0; k < MAXI * MAXI; k++)
{
dp[i, j, k] = -1;
}
}
}
Console.WriteLine(minDifference(0, 0, 0, b, c));
}
}