Advertisement
Guest User

Untitled

a guest
Mar 9th, 2024
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll=long long;
  4.  
  5. const int N=2000;
  6. vector<vector<vector<int>>> dp(N+1,vector<vector<int>> (N+1));
  7. vector<vector<vector<int>>> dp1(N+1,vector<vector<int>> (N+1));
  8. signed main()
  9. {
  10.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  11.     int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;i++)   cin>>a[i];
  12.     vector<int> pref=a;for(int i=1;i<=n;i++)    pref[i]+=pref[i-1];
  13.     if(a[n]>=pref[n-1]){
  14.         cout<<a[n]<<" "<<pref[n-1]<<"\n";return 0;
  15.     }
  16.     a.push_back(a[n]);
  17.     for(int l=n;l>=1;l--)
  18.     {
  19.         for(int r=l;r<=n;r++)
  20.             dp[l][r].resize(a[r+1]+1),dp1[l][r].resize(a[r+1]+1);
  21.         for(int lead=0;lead<=a[l+1];lead++)
  22.             dp[l][l][lead]=dp1[l][l][lead]=a[l];
  23.         dp1[l][l][0]=0;
  24.         for(int r=l+1;r<=n;r++)
  25.         {
  26.             int currind=r,currind1=r;
  27.             for(int lead=0;lead<dp[l][r].size();lead++)
  28.             {
  29.                 int sum=0;
  30.                 if(lead>=a[l])
  31.                     sum=max(sum,dp[l+1][r][lead-a[l]]+a[l]);
  32.                 else
  33.                     sum=max(sum,a[l]+pref[r]-pref[l]-dp1[l+1][r][a[l]-lead]);
  34.                
  35.                 while(pref[r]-pref[currind]<=lead && currind>=l)
  36.                     currind--;
  37.                
  38.                 int t;
  39.                 if(l>currind)
  40.                     t=0;
  41.                 else
  42.                     t=dp1[l][currind][(pref[r]-pref[currind])-lead];
  43.  
  44.                 sum=max( sum, pref[currind] - pref[l-1] - t + pref[r]-pref[currind]);
  45.                 dp[l][r][lead]=sum;
  46.                
  47.                
  48.                
  49.                 sum=0;
  50.                 if(lead>a[l])
  51.                     sum=max(sum,dp1[l+1][r][lead-a[l]]+a[l]);
  52.                 else
  53.                     sum=max(sum,a[l]+pref[r]-pref[l]-dp[l+1][r][a[l]-lead]);
  54.                
  55.                 while(pref[r]-pref[currind1]<lead && currind1>=l)
  56.                     currind1--;
  57.                 if(l>currind1)
  58.                     t=0;
  59.                 else
  60.                     t=dp[l][currind1][(pref[r]-pref[currind1])-lead];
  61.                 sum=max( sum, pref[currind1] - pref[l-1] - t + pref[r]-pref[currind1]);
  62.                 dp1[l][r][lead]=sum;
  63.             }
  64.         }
  65.     }
  66.     // cout<<dp1[1][2][1331]<<"\n";
  67.     cout<<dp[1][n][0]<<" "<<pref[n]-dp[1][n][0]<<"\n";
  68. }
  69.  
  70.  
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement