石子归并
#include<cstdio>
#include<iostream>
#define maxn 0x7fffffff
using namespace std;
int n,sum[1003][1003],num[1003],fn[1003][1003],fx[1003][1003];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
sum[i][1]=num[i];
fn[i][1]=fx[i][1]=0;
}
for(int j=2;j<=n;j++)
for(int i=1;i<=n;i++)
sum[i][j]=sum[i%n+1][j-1]+num[i];
for(int j=2;j<=n;j++){
for(int i=1;i<=n;i++){
int tmp=sum[i][j];
fn[i][j]=maxn;
fx[i][j]=-maxn;
for(int k=1;k<=j-1;k++){
int x=(i+k-1)%n+1;
fn[i][j]=min(fn[i][k]+fn[x][j-k]+tmp,fn[i][j]);
fx[i][j]=max(fx[i][k]+fn[x][j-k]+tmp,fx[i][j]);
}
}
}int xans=-maxn,nans=maxn;
for(int i=1;i<=n;i++)nans=min(nans,fn[i][n]),xans=max(xans,fx[i][n]);
printf("%d\n%d\n",nans,xans);
return 0;
}

浙公网安备 33010602011771号