Advertisement
erek1e

CSES - Subarray Squares

May 16th, 2023
810
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.94 KB | None | 0 0
  1. // Divide and Conquer DP Optimisation
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. const long long INF = 1e18;
  7. vector<int> a, p;
  8. vector<vector<long long>> cost;
  9. void solve(int parts, int l, int r, int optl, int optr) {
  10.     if (l > r) return;
  11.     int mid = (l + r) / 2;
  12.     pair<long long, long long> best = {INF, optl};
  13.     for (int i = optl; i <= optr && i < mid; ++i) {
  14.         best = min(best, {cost[parts-1][i] + (long long)(p[mid]-p[i])*(p[mid]-p[i]), i});
  15.     }
  16.     cost[parts][mid] = best.first;
  17.     int opt = best.second;
  18.     solve(parts, l, mid-1, optl, opt);
  19.     solve(parts, mid+1, r, opt, optr);
  20. }
  21.  
  22. int main() {
  23.     int n, k; cin >> n >> k;
  24.     a = p = vector<int>(1+n);
  25.     for (int i = 1; i <= n; ++i) cin >> a[i], p[i] = p[i-1] + a[i];
  26.     cost.assign(1+k, vector<long long>(1+n, INF));
  27.     cost[0][0] = 0;
  28.     for (int i = 1; i <= k; ++i) solve(i, 1, n, 0, n-1);
  29.     cout << cost[k][n] << endl;
  30.     return 0;
  31. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement