Advertisement
Yesver08

d.cpp (wa)

Apr 27th, 2024 (edited)
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <unordered_map>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. #define ull unsigned long long
  9. unordered_map<string, ull> cache;
  10. ull dp(const vector<ull>& prefix, ull l, ull r) {
  11.     if (l >= r) {
  12.         return 0;
  13.     }
  14.     string key = l + "-" + r;
  15.     if (cache.find(key) != cache.end()) {
  16.         return cache[key];
  17.     }
  18.     ull current = 0;
  19.     for (ull i = l; i < r; ++i) {
  20.         ull scoreL = prefix[i];
  21.         if (l > 0) {
  22.             scoreL -= prefix[l - 1];
  23.         }
  24.         ull scoreR = prefix[r] - prefix[i];
  25.         if (scoreL > scoreR) {
  26.             current = max(current, scoreR + dp(prefix, i + 1, r));
  27.         } else if (scoreL < scoreR) {
  28.             current = max(current, scoreL + dp(prefix, l, i));
  29.         } else {
  30.             ull tempL = scoreL + dp(prefix, i + 1, r);
  31.             ull tempR = scoreR + dp(prefix, l, i);
  32.             current = max(current, max(tempL, tempR));
  33.         }
  34.     }
  35.     cache[key] = current;
  36.     return current;
  37. }
  38.  
  39. int main() {
  40.     ull n;
  41.     cin >> n;
  42.     vector<ull> N(n);
  43.     for (ull i = 0; i < n; ++i) {
  44.         cin >> N[i];
  45.     }
  46.     vector<ull> prefix(N.size());
  47.     prefix[0] = N[0];
  48.     for (size_t i = 1; i < N.size(); ++i) {
  49.         prefix[i] = N[i] + prefix[i - 1];
  50.     }
  51.     cout << dp(prefix, 0, prefix.size() - 1) << "\n";
  52.     return 0;
  53. }
  54.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement