#include <bits/stdc++.h>
using namespace std;
int n;
int m;
int a[605];
int qzh[605];
int dp[605][605];
int ans[2];
void init(bool op){
if (!op){
memset(dp,0x3f,sizeof(dp));
for (int i = 0;i <= 600;i++){
dp[i][i] = 0;
}
ans[0] = 0x3fffffff;
} else{
for (int i = 0;i <= 600;i++){
for (int j = 0;j <= 600;j++){
dp[i][j] = -1;
dp[i][i] = 0;
}
}
ans[1] = -1;
}
}
void solve(bool op){
if (!op){
for (int si = 2;si <= n;si++){
for (int l = 1;l + si - 1 <= m;l++){
int r = l + si - 1;
for (int i = l;i < r;i++){
dp[l][r] = min(dp[l][r],dp[l][i] + dp[i + 1][r] + qzh[r] - qzh[l - 1]);
}
}
}
for (int i = 1;i <= n;i++) ans[0] = min(ans[0],dp[i][i + n - 1]);
} else {
for (int si = 2;si <= n;si++){
for (int l = 1;l + si - 1 <= m;l++){
int r = l + si - 1;
for (int i = l;i < r;i++){
dp[l][r] = max(dp[l][r],dp[l][i] + dp[i + 1][r] + qzh[r] - qzh[l - 1]);
}
}
}
for (int i = 1;i <= n;i++) ans[1] = max(ans[0],dp[i][i + n - 1]);
}
}
void answer(){
init(0);
solve(0);
init(1);
solve(1);
}
signed main(){
cin >> n;
m = 2 * n;
for (int i = 1;i <= n;i++){
cin >> a[i];
a[i + n] = a[i];
}
for (int i = 1;i <= m;i++){
qzh[i] = qzh[i - 1] + a[i];
}
answer();
cout << ans[0] << endl << ans[1] << endl;
return 0;
}
WA了第2、3、4个点。 下了数据(第二个点)
P1880_2.in
46
16 4 14 12 0 3 11 8 18 2 6 8 6 7 13 7 8 14 11 2 16 12 16 0 8 1 3 10 7 16 0 16 11 17 13 18 5 15 0 12 19 0 0 5 3 1
P1880_2.out
2087
10554
