using
System;
public
class
Solution
{
static
int
[,,] dp;
static
int
unSolved = -1;
static
int
[,] directions = { { 0, 1, 1 }, { 0, 1, 0 }, { 1, 0, 0 }, { 1, 0, 1 } };
static
bool
IsValid(
int
i1,
int
j1,
int
j2,
int
n)
{
int
i2 = i1 + j1 - j2;
return
i1 >= 0 && i1 < n && i2 >= 0 && i2 < n && j1 >= 0 && j1 < n && j2 >= 0 && j2 < n;
}
static
int
F(
int
i1,
int
j1,
int
j2,
int
[,] grid)
{
int
n = grid.GetLength(0);
if
(i1 == j1 && j1 == j2 && i1 == n - 1)
{
return
grid[i1, j1];
}
if
(dp[i1, j1, j2] != unSolved)
{
return
dp[i1, j1, j2];
}
int
i2 = i1 + j1 - j2;
if
(grid[i1, j1] == -1 || grid[i2, j2] == -1)
{
return
int
.MinValue;
}
int
maxSum =
int
.MinValue;
int
val = (i1 == i2 && j1 == j2) ? grid[i1, j1] : grid[i1, j1] + grid[i2, j2];
for
(
int
direction = 0; direction < directions.GetLength(0); direction++)
{
int
deli1 = directions[direction, 0];
int
delj1 = directions[direction, 1];
int
delj2 = directions[direction, 2];
if
(IsValid(i1 + deli1, j1 + delj1, j2 + delj2, n))
{
int
currentSum = val + F(i1 + deli1, j1 + delj1, j2 + delj2, grid);
maxSum = Math.Max(maxSum, currentSum);
}
}
dp[i1, j1, j2] = maxSum;
return
maxSum;
}
public
int
ChocolatePickup(
int
[,] grid)
{
int
n = grid.GetLength(0);
dp =
new
int
[n, n, n];
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = 0; j < n; j++)
{
for
(
int
k = 0; k < n; k++)
{
dp[i, j, k] = unSolved;
}
}
}
int
result = F(0, 0, 0, grid);
return
(result > 0) ? result : 0;
}
public
static
void
Main(
string
[] args)
{
Solution obj =
new
Solution();
int
[,] grid = { { 0, 1, -1 }, { 1, 0, -1 }, { 1, 1, 1 } };
int
result = obj.ChocolatePickup(grid);
Console.WriteLine(result);
}
}