using
System;
using
System.Linq;
class
GFG
{
static
long
MAX = 1000000007;
static
long
[, ] dp =
new
long
[5001, 5001];
static
long
recur(
int
i,
int
j,
int
[] a,
int
[] hash,
int
N)
{
if
(i == N) {
return
0;
}
if
(dp[i, j] != -1) {
return
dp[i, j];
}
long
ans = recur(i + 1, j + 1, a, hash, N) + a[i]
+ hash[j + 1];
ans = Math.Max(ans,
recur(i + 1, 0, a, hash, N) + 0);
return
dp[i, j] = ans;
}
static
void
findMaximumScore(
int
[] a,
int
[, ] b,
int
N,
int
M)
{
for
(
int
i = 0; i < 5001; i++) {
for
(
int
j = 0; j < 5001; j++) {
dp[i, j] = -1;
}
}
int
[] hash =
new
int
[N + 1];
for
(
int
i = 0; i < M; i++) {
hash[b[i, 0]] += b[i, 1];
}
Console.WriteLine(recur(0, 0, a, hash, N));
}
public
static
void
Main(
string
[] args)
{
int
[] a = { 2, 7, 1, 8, 2, 8 };
int
[, ] b = { { 2, 10 }, { 3, 1 }, { 5, 5 } };
int
N = a.Length;
int
M = b.GetLength(0);
findMaximumScore(a, b, N, M);
int
[] a1 = { 1000000000, 1000000000, 1000000000 };
int
[, ] b1
= { { 1, 1000000000 }, { 3, 1000000000 } };
int
N1 = a1.Length;
int
M1 = b1.GetLength(0);
findMaximumScore(a1, b1, N1, M1);
}
}