using
System;
class
Program {
static
int
R = 5;
static
int
C = 5;
public
static
void
Main(String[] args)
{
char
[, ] arr = { {
'E'
,
'C'
,
'C'
,
'C'
,
'C'
},
{
'C'
,
'#'
,
'C'
,
'#'
,
'E'
},
{
'#'
,
'C'
,
'C'
,
'#'
,
'C'
},
{
'C'
,
'E'
,
'E'
,
'C'
,
'E'
},
{
'C'
,
'E'
,
'#'
,
'C'
,
'E'
} };
Console.WriteLine(
"Maximum number of collected coins is "
+ maxCoins(arr));
}
public
static
int
maxCoins(
char
[, ] arr)
{
int
[, , ] dp =
new
int
[5, 5, 2];
for
(
int
i = 0; i < 5; i++)
for
(
int
j = 0; j < 5; j++) {
dp[i, j, 0] = -1;
dp[i, j, 1] = -1;
}
return
maxCoinsUtil(arr, 0, 0, 1, dp);
}
public
static
bool
isValid(
int
i,
int
j)
{
return
(i >= 0 && i < R && j >= 0 && j < C);
}
public
static
int
maxCoinsUtil(
char
[, ] arr,
int
i,
int
j,
int
dir,
int
[, , ] dp)
{
if
(!isValid(i, j) || arr[i, j] ==
'#'
)
return
0;
if
(dp[i, j, dir] != -1)
return
dp[i, j, dir];
;
dp[i, j, dir] = (arr[i, j] ==
'C'
) ? 1 : 0;
if
(dir == 1) {
dp[i, j, dir] += Math.Max(
maxCoinsUtil(arr, i + 1, j, 0, dp),
maxCoinsUtil(arr, i, j + 1, 1,
dp));
}
if
(dir == 0) {
dp[i, j, dir] += Math.Max(
maxCoinsUtil(arr, i + 1, j, 1, dp),
maxCoinsUtil(arr, i, j - 1, 0,
dp));
}
return
dp[i, j, dir];
}
}