Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll=long long;
- const int N=2000;
- vector<vector<vector<int>>> dp(N+1,vector<vector<int>> (N+1));
- vector<vector<vector<int>>> dp1(N+1,vector<vector<int>> (N+1));
- signed main()
- {
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;i++) cin>>a[i];
- vector<int> pref=a;for(int i=1;i<=n;i++) pref[i]+=pref[i-1];
- if(a[n]>=pref[n-1]){
- cout<<a[n]<<" "<<pref[n-1]<<"\n";return 0;
- }
- a.push_back(a[n]);
- for(int l=n;l>=1;l--)
- {
- for(int r=l;r<=n;r++)
- dp[l][r].resize(a[r+1]+1),dp1[l][r].resize(a[r+1]+1);
- for(int lead=0;lead<=a[l+1];lead++)
- dp[l][l][lead]=dp1[l][l][lead]=a[l];
- dp1[l][l][0]=0;
- for(int r=l+1;r<=n;r++)
- {
- int currind=r,currind1=r;
- for(int lead=0;lead<dp[l][r].size();lead++)
- {
- int sum=0;
- if(lead>=a[l])
- sum=max(sum,dp[l+1][r][lead-a[l]]+a[l]);
- else
- sum=max(sum,a[l]+pref[r]-pref[l]-dp1[l+1][r][a[l]-lead]);
- while(pref[r]-pref[currind]<=lead && currind>=l)
- currind--;
- int t;
- if(l>currind)
- t=0;
- else
- t=dp1[l][currind][(pref[r]-pref[currind])-lead];
- sum=max( sum, pref[currind] - pref[l-1] - t + pref[r]-pref[currind]);
- dp[l][r][lead]=sum;
- sum=0;
- if(lead>a[l])
- sum=max(sum,dp1[l+1][r][lead-a[l]]+a[l]);
- else
- sum=max(sum,a[l]+pref[r]-pref[l]-dp[l+1][r][a[l]-lead]);
- while(pref[r]-pref[currind1]<lead && currind1>=l)
- currind1--;
- if(l>currind1)
- t=0;
- else
- t=dp[l][currind1][(pref[r]-pref[currind1])-lead];
- sum=max( sum, pref[currind1] - pref[l-1] - t + pref[r]-pref[currind1]);
- dp1[l][r][lead]=sum;
- }
- }
- }
- // cout<<dp1[1][2][1331]<<"\n";
- cout<<dp[1][n][0]<<" "<<pref[n]-dp[1][n][0]<<"\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement