代码如下,其中 f 表示 [l,r] 合并的最大值,g 表示最小值:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
int a[201], f[201][201], g[201][201];
int main() {
memset(g, 0x3f, sizeof(g));
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i + n] = a[i];
}
for (int i = 1; i <= 2 * n; i++) {
a[i] += a[i - 1];
g[i][i] = 0;
}
for (int len = 2; len <= n; len++) {
for (int left = 1; left <= n; left++) {
int right = left + len - 1;
for (int mid = left; mid < right; mid++) {
f[left][right] =
std::max(f[left][right],
a[right] - a[left - 1] + f[left][mid] + f[mid + 1][right]);
g[left][right] =
std::min(g[left][right],
a[right] - a[left - 1] + g[left][mid] + g[mid + 1][right]);
}
}
}
int ans1 = 0, ans2 = 0x3f3f3f3f;
for (int i = 1; i <= n; i++) {
ans1 = std::max(ans1, f[i][i + n - 1]);
ans2 = std::min(ans2, g[i][i + n - 1]);
}
cout << ans2 << '\n' << ans1 << '\n';
}
这应该是比较符合题意的做法,但测试点二、三、四答案错误。其中测试点二正确答案为 2087 10554,我的代码得到 2087 10544。