int f[410][410], g[410][410], p[410];
int main()
{
//freopen("in.txt", "r", stdin);
int n;
while (cin >> n)
{
f(i, 1, n)scanf("%d", &p[i]), p[n + i] = p[i];
f(i, 1, 2 * n)p[i] += p[i - 1];
f(len, 2, n)//区间长度
{
for (int l = 1;l + len - 1 <= n*2;l++)//枚举长度为len的所有区间起点
{
int r = l + len - 1;
f[l][r] = inf, g[l][r] = -inf;
f(k, l, r - 1)//枚举分割点
{
f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + p[r] - p[l - 1]);
g[l][r] = max(g[l][r], g[l][k] + g[k + 1][r] + p[r] - p[l - 1]);
}
}
}
//对所有长度为n的区间求最大,最小
int ans1 = inf, ans2 = -inf;
f(i, 1, n)
{
ans1 = min(ans1, f[i][i + n - 1]);
ans2 = max(ans2, g[i][i + n - 1]);
}
cout << ans1 <<endl << ans2 << endl;
}
return 0;
}
环形石子合并(区间dp模板题)
最新推荐文章于 2022-04-10 22:15:32 发布