using
System;
class
GFG {
static
int
[, , , ] dp =
new
int
[50, 50, 50, 50];
static
int
FindMaxS(
int
X,
int
Y,
int
Z,
int
n,
int
[] A,
int
[] B,
int
[] C)
{
if
(X < 0 || Y < 0 || Z < 0)
return
Int32.MinValue;
if
(n < 0)
return
0;
if
(dp[n, X, Y, Z] != -1) {
return
dp[n, X, Y, Z];
}
int
ch
= A[n] + FindMaxS(X - 1, Y, Z, n - 1, A, B, C);
int
ca
= B[n] + FindMaxS(X, Y - 1, Z, n - 1, A, B, C);
int
co
= C[n] + FindMaxS(X, Y, Z - 1, n - 1, A, B, C);
int
no = FindMaxS(X, Y, Z, n - 1, A, B, C);
int
maximum
= Math.Max(ch, Math.Max(ca, Math.Max(co, no)));
return
dp[n, X, Y, Z] = maximum;
}
public
static
void
Main(
string
[] args)
{
int
X = 1;
int
Y = 1;
int
Z = 1;
int
[] A = { 10, 0, 5 };
int
[] B = { 5, 10, 0 };
int
[] C = { 0, 5, 10 };
int
n = B.Length;
for
(
int
i = 0; i < 50; i++)
for
(
int
j = 0; j < 50; j++)
for
(
int
k = 0; k < 50; k++)
for
(
int
l = 0; l < 50; l++)
dp[i, j, k, l] = -1;
Console.Write(FindMaxS(X, Y, Z, n - 1, A, B, C));
}
}