合并石子的变型(链式)
将环形石子变为链式。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 420;
int n;
int a[N];
int sum[N];
int f[N][N];
int g[N][N];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
a[i + n] = a[i];
}
for(int i = 1; i <= 2 * n; i++){
sum[i] = sum[i - 1] + a[i];
// cout << "i = " << i <<". sum[i]="<<sum[i] << endl;
}
memset(f,0x3f,sizeof(f));
memset(g,-0x3f,sizeof(g));
for(int len = 1; len <= n; len ++){
for(int i = 1; i + len - 1 <= 2 * n; i++){
int j = i + len - 1;
if(i == j){
f[i][j] = g[i][j] = 0;
}
for(int k = i; k < j; k++){
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + sum[j] - sum[i - 1]);
g[i][j] = max(g[i][j], g[i][k] + g[k + 1][j] + sum[j] - sum[i - 1]);
}
}
}
int mx = -0x3f3f3f3f, mi = 0x3f3f3f3f;
for(int i = 1; i <= n; i++){
mx = max(mx, g[i][i + n - 1]);
mi = min(mi, f[i][i + n - 1]);
}
cout << mi << endl << mx << endl;
return 0;
}