| 12
 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;
 }
 
 |