样例输出
30
54
推测可能和求取最小值的dp数组minS初始化有关。
#include <bits/stdc++.h>
using namespace std;
const int M = 256;
int n;
int a[M];
int sum[M]; // 前缀和 of a
int maxS[M][M], minS[M][M]; // i-j合并后的最大/最小分数
int main()
{
scanf("%d", &n);
for (int i=0; i<n; i++)
{
scanf("%d", &a[i]);
a[i+n] = a[i];
}
sum[0] = sum[n] = a[0];
for (int i=1; i<=n*2; i++)
sum[i] = sum[i-1]+a[i];
// dp
for (int len=2; len<=n; len++)
for (int l=0; l<2*n; l++)
{
int r = l+len;
if (r>=2*n) continue;
minS[l][r] = INT_MAX/4;
for (int cut=l; cut<r; cut++)
{
maxS[l][r] = max(
maxS[l][r],
maxS[l][cut] + maxS[cut+1][r] + (sum[r]-sum[l])
);
minS[l][r] = min(
minS[l][r],
minS[l][cut] + minS[cut+1][r] + (sum[r]-sum[l])
);
}
}
int minA=INT_MAX, maxA=0;
for (int l=0; l<n; l++)
{
int r = l+n;
minA = min(minA, minS[l][r]);
maxA = max(maxA, maxS[l][r]);
}
printf("%d\n%d\n", minA, maxA);
return 0;
}