//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
int n;
int stone[250];
int sum[250];
int dp1[250][250];
int dp2[250][250];
void read(int &x)
{
int num=0,f=1;
char c;
c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9')
{
num=(num<<3)+(num<<1)+(c^48);
c=getchar();
}
x=f*num;
}
void print(int x)
{
if(x<0)
{
x=-x;
putchar('-');
}
if(x>=10)
{
print(x/10);
}
putchar(x%10+'0');
}
int main()
{
//ios::sync_with_stdio(0);
read(n);
for(int i=1;i<=n;i++)
{
cin>>stone[i];
stone[n+i]=stone[i];
}
for(int i=1;i<=2*n;i++)
{
sum[i]=sum[i-1]+stone[i];
}
for(int i=1;i<=2*n;i++)
{
for(int j=1;j<=2*n;j++)
{
dp1[i][j]=65536;
}
}
for(int i=1;i<=2*n;i++)
{
dp1[i][i]=0;
}
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=2*n;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
{
dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
dp2[i][j]=max(dp2[i][j],dp1[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
// cout<<i<<" "<<j<<" "<<dp2[i][j]<<" "<<dp2[i][k]<<" "<<dp2[k+1][j]<<" "<<sum[j]<<" "<<sum[i-1]<<endl;
}
}
}
// for(int i=1;i<=n;i++)
// {
// cout<<dp1[i][i+n-1]<<" "<<dp2[i][i+n-1]<<endl;
// }
int ans1=2147483647,ans2=0;
for(int i=1;i<=n;i++)
{
ans1=min(ans1,dp1[i][i+n-1]);
ans2=max(ans2,dp2[i][i+n-1]);
}
print(ans1);
puts("");
print(ans2);
return 0;
}
rt
错误数据:
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
答案:
2087
10554
我的答案
2087
10483
求助大佬