#6103. 消消乐(Elimination)
消消乐(Elimination)
消消乐(Elimination)
题目描述
给定一个由 个整数构成的数组 。每次你可以对数组 进行以下操作,直到数组 变为空:
- 指定 中的一个元素,获得该元素两侧相邻元素之和的分数,并将该元素从 中删去。
特别地,如果相邻元素不存在则该元素的值视为 。例如,对于 可以进行以下操作:
- 指定元素 ,获得分数 ,删去 后 ;
- 指定元素 ,获得分数 ,删去 后 ;
- 指定元素 ,获得分数 ,删去 后 变为空。
请问你能获得的分数总和最大是多少?
输入格式
第一行,一个正整数 ,表示数组长度。
第二行, 个非负整数 ,表示数组 中的整数。
输出格式
输出一行,一个整数,表示能获得的最大分数总和。
样例输入 #1
6
1 6 3 2 9 1
样例输出 #1
55
样例输入 #2
5
3 1415 926 53 58
样例输出 #2
5771
数据范围
对于 的测试点,保证 。
对于所有测试点,保证 ,。
参考程序
#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;
}