Advertisement
ThegeekKnight16

NKLEAVES - DCT

Sep 20th, 2023
1,109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int INF = 0x3f3f3f3f3f3f3f3f;
  5. vector<int> v, s, ss;
  6.  
  7. void fazdp(int ini, int fim, int optini, int optfim, const vector<int> &dp_ant, vector<int> &dp)
  8. {
  9.     if (ini > fim) return;
  10.     int mid = (ini + fim) >> 1;
  11.     int resp = INF; int opt = -1;
  12.     for (int i = optini; i <= min(mid, optfim); i++)
  13.     {
  14.         int atual = dp_ant[i-1] + (ss[mid] - ss[i-1]) - i * (s[mid] - s[i-1]);
  15.         if (atual < resp) resp = atual, opt = i;
  16.     }
  17.     dp[mid] = resp;
  18.     fazdp(ini, mid-1, optini, opt, dp_ant, dp);
  19.     fazdp(mid+1, fim, opt, optfim, dp_ant, dp);
  20. }
  21.  
  22. int32_t main()
  23. {
  24.     ios_base::sync_with_stdio(false);
  25.     cin.tie(NULL);
  26.     int N, K;
  27.     cin >> N >> K;
  28.     v.resize(N+1); s.resize(N+1); ss.resize(N+1);
  29.     for (int i = 1; i <= N; i++)
  30.     {
  31.         cin >> v[i];
  32.         s[i] = s[i-1] + v[i];
  33.         ss[i] = ss[i-1] + v[i]*i;
  34.     }
  35.     vector<int> dp(N+1, INF);
  36.     dp[0] = 0;
  37.     for (int i = 1; i <= K; i++)
  38.     {
  39.         vector<int> dp2(N+1, INF);
  40.         fazdp(1, N, 1, N, dp, dp2);
  41.         dp = dp2;
  42.     }
  43.     cout << dp[N] << '\n';
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement