石子归并
#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; }