#6103. 消消乐(Elimination)

消消乐(Elimination)

消消乐(Elimination)

题目描述

给定一个由 nn 个整数构成的数组 a=[a1,,an]a = [a_1, \ldots, a_n]。每次你可以对数组 aa 进行以下操作,直到数组 aa 变为空:

  • 指定 aa 中的一个元素,获得该元素两侧相邻元素之和的分数,并将该元素从 aa 中删去。

特别地,如果相邻元素不存在则该元素的值视为 00。例如,对于 a=[1,2,3]a = [1, 2, 3] 可以进行以下操作:

  • 指定元素 22,获得分数 1+3=41 + 3 = 4,删去 22a=[1,3]a = [1, 3]
  • 指定元素 11,获得分数 0+3=30 + 3 = 3,删去 11a=[3]a = [3]
  • 指定元素 33,获得分数 0+0=00 + 0 = 0,删去 33aa 变为空。

请问你能获得的分数总和最大是多少?

输入格式

第一行,一个正整数 nn,表示数组长度。

第二行,nn 个非负整数 a1,a2,,ana_1, a_2, \ldots, a_n,表示数组 aa 中的整数。

输出格式

输出一行,一个整数,表示能获得的最大分数总和。

样例输入 #1

6
1 6 3 2 9 1

样例输出 #1

55

样例输入 #2

5
3 1415 926 53 58

样例输出 #2

5771

数据范围

对于 40%40\% 的测试点,保证 1n501 \le n \le 50

对于所有测试点,保证 1n1001 \le n \le 1000ai1090 \le a_i \le 10^9

参考程序

#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[110];
long long f[110][110];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        for (int l = 1, r = i; r <= n; l++, r++)
            for (int k = l; k <= r; k++)
                f[l][r] = max(f[l][r], f[l][k - 1] + f[k + 1][r] + a[l - 1] + a[r + 1]);
    cout << f[1][n] << endl;
    return 0;
}