信息
- ID
- 1639
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 158
- 已通过
- 65
- 上传者
'''和上一题十分类似,简单加点东西就好了。这里不多做解释。代码比较好理解。
/*****************************************
备注:
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int n;
int dp[505][505];
int f[505][505];
int a[305];
int sum[N];
int main(){
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++)
{
sum[i] = sum[i - 1] + a[i];
}
for(int k = 2; k <= n; k++)
{
for(int l = 1; l + k - 1 <= 2 * n; l++)
{
int r = l + k - 1;
f[l][r] = INF;
for(int i = l; i < r; i++)
{
dp[l][r] = max(dp[l][r], dp[l][i] + dp[i + 1][r] + sum[r] - sum[l - 1]);
f[l][r] = min(f[l][r], f[l][i] + f[i + 1][r] + sum[r] - sum[l - 1]);
}
}
}
int minn = INF;
int maxx = 0;
for(int i = 1; i <= n; i++)
{
maxx = max(maxx, dp[i][i + n - 1]);
minn = min(minn, f[i][i + n - 1]);
}
cout<<minn<<endl;
cout<<maxx<<endl;
return 0;
}