Advertisement
matheus_monteiro

Mububa

May 6th, 2021
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int MAX = 2000000; //2 * 10^5
  5. const int OO = 0x3f3f3f3f3f3f3f3f;
  6.  
  7. int n, arr[3005], pf[MAX];
  8. int dp[3005][3005];
  9. int seen[3005][3005];
  10.  
  11. int get(int l, int r) {
  12.     if(l > r) return 0;
  13.     return pf[r] - pf[l - 1];
  14. }
  15.  
  16. int solve(int l, int r) {
  17.     if(r == n + 1) return 0;
  18.     if(seen[l][r]) return dp[l][r];
  19.     int k = lower_bound(pf + 1, pf + n + 1, pf[r] + get(l, r)) - pf;
  20.    
  21.     int ans1 = 0;
  22.    
  23.     if(get(l, r) <= get(r + 1, k))
  24.         ans1 = solve(r + 1, k) + 1;
  25.    
  26.     int ans2 = solve(l, r + 1);
  27.    
  28.     seen[l][r] = 1;
  29.  
  30.     return dp[l][r] = max(ans1, ans2);
  31. }
  32.  
  33. int32_t main()
  34. {
  35.     ios_base::sync_with_stdio(false);
  36.     cin.tie(nullptr);
  37.  
  38.     cin >> n;
  39.     for(int i = 1; i <= n; i++)
  40.         cin >> arr[i], pf[i] = pf[i - 1] + arr[i];
  41.  
  42.     int ans = 0;
  43.     for(int i = 1; i <= n; i++)
  44.         ans = max(ans, 1 + solve(1, i));
  45.  
  46.     cout << ans << '\n';
  47.    
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement