using
System;
public
class
MaximumPoints
{
static
int
[,,] memo =
new
int
[200, 200, 200];
public
static
int
Dp(
int
[] arr,
int
l,
int
r,
int
k)
{
if
(l > r)
return
0;
if
(memo[l, r, k] > 0)
return
memo[l, r, k];
int
lOriginal = l, kOriginal = k;
while
(l + 1 <= r && arr[l] == arr[l + 1])
{
l += 1;
k += 1;
}
int
ans = (k + 1) * (k + 1) + Dp(arr, l + 1, r, 0);
for
(
int
m = l + 1; m <= r; ++m)
{
if
(arr[m] == arr[l])
{
ans = Math.Max(
ans, Dp(arr, m, r, k + 1)
+ Dp(arr, l + 1, m - 1, 0));
}
}
return
memo[lOriginal, r, kOriginal] = ans;
}
public
static
void
Main(
string
[] args)
{
int
[] arr = { 1, 3, 2, 2, 2, 3, 4, 3, 1 };
int
maxPoints = Dp(arr, 0, arr.Length - 1, 0);
Console.WriteLine(
"Maximum points: "
+ maxPoints);
}
}