1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f3f3fll #define debug(x) cerr<<#x<<"="<<x<<endl using namespace std; using ll=long long; using ld=long double; using pli=pair<ll,int>; using pi=pair<int,int>; template<typename A> using vc=vector<A>; inline int read() { int s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int dp[44000001][2]; int id[2001][2001]; int pre[2001]; int num[2001]; int wh[20001]; int a[2001]; int n,cnt; #define dp(l,r,x,p) dp[id[l][r]+x][p] int main() { n=read(),num[n]=n; for(int i=1;i<=n;i++) { pre[i]=pre[i-1]+(a[i]=read()); wh[pre[i]]=i; } for(int i=1;i<=pre[n];i++) if(!wh[i]) wh[i]=wh[i-1]; for(int i=1;i<n;i++) { int val=0,j=i; while(j>1&&val<a[i+1]) j--,val+=a[j]; num[i]=j; } for(int l=1;l<=n;l++) for(int r=l;r<=n;r++) { id[l][r]=cnt; int val=r==n?a[l-1]:a[r+1]; cnt+=val+1; } for(int i=1;i<=n;i++) { int lim=i==n?a[i-1]:a[i+1]; for(int j=0;j<=lim;j++) dp(i,i,j,0)=a[i]; for(int j=1;j<=lim;j++) dp(i,i,j,1)=a[i]; } for(int len=2;len<=n;len++) for(int l=1,r=len;r<=n;l++,r++) { int lim=r==n?a[l-1]:a[r+1],sum=pre[r]-pre[l-1]; for(int x=1;x<=lim;x++) for(int w=0;w<2;w++) { if(sum<=x) { dp(l,r,x,w)=sum; continue; } if(a[l]<x) dp(l,r,x,w)=a[l]+dp(l+1,r,x-a[l],w); else dp(l,r,x,w)=sum-dp(l+1,r,a[l]-x,1-w); int f=wh[max(0,pre[r]-x)]+1,e=pre[r]-pre[f-1]; if(e<x) dp(l,r,x,w)=max(dp(l,r,x,w),e+dp(l,f-1,x-e,w)); else dp(l,r,x,w)=max(dp(l,r,x,w),sum-dp(l,f-1,e-x,1-w)); } dp(l,r,0,1)=min(dp(l,r-1,a[r],1),dp(l+1,r,a[l],1)); dp(l,r,0,0)=sum-dp(l,r,0,1); } printf("%d %d\n",dp(1,n,0,0),dp(1,n,0,1)); return 0; }
|