Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define inf 1e18
  4. #define ff first
  5. #define ss second
  6. #define all(v) v.begin() , v.end()
  7. using namespace std;
  8. typedef long long ll;
  9. typedef pair <int, int> pii;
  10.  
  11. int n, k;
  12. vector <vector <int> > dp;
  13. vector <int> a, suf_sum, suf_val;
  14.  
  15. /// debug ///
  16. //int dp[305][305], a[305], pref[305];
  17. /// debug ///
  18.  
  19. void init(){
  20. n = min(n, k);
  21. a.resize(k); suf_sum.resize(k); suf_val.resize(k);
  22. dp.resize(n); for (auto &u: dp) u.resize(k, inf);
  23. for (int i = 0; i < k; i++)
  24. cin >> a[i];
  25. for (int i = k - 1; i >= 0; i--){
  26. suf_sum[i] = a[i];
  27. if (i != k - 1) suf_sum[i] += suf_sum[i + 1];
  28. }
  29. for (int i = k - 1; i >= 0; i--){
  30. suf_val[i] = suf_sum[i];
  31. if (i != k - 1) suf_val[i] += suf_val[i + 1];
  32. }
  33. for (int i = 0; i < k; i++){
  34. dp[0][i] = (i + 1) * a[i];
  35. if (i) dp[0][i] += dp[0][i - 1];
  36. }
  37. }
  38.  
  39. int func(int l, int r){
  40. if (r == k - 1) return suf_val[l];
  41. return suf_val[l] - suf_val[r + 1] - suf_sum[r + 1] * (r - l + 1);
  42. }
  43.  
  44. void solve(int L, int R, int l, int r, int h){
  45. if (L > R) return;
  46. int mid = (L + R) / 2;
  47. pair <ll, int> opt = {inf, -1};
  48. for (int i = min(mid - 1, r); i >= l; i--){
  49. opt = min(opt, make_pair(dp[h - 1][i] + func(i + 1, mid), i));
  50. }
  51. dp[h][mid] = opt.first;
  52. solve(L, mid - 1, l, opt.second, h);
  53. solve(mid + 1, R, opt.second, r, h);
  54. }
  55.  
  56. int32_t main()
  57. {
  58. #ifdef VBH
  59. freopen("input.txt" , "r" , stdin);
  60. #endif
  61. ios_base::sync_with_stdio(false);
  62. cin.tie(0);
  63. cin >> n >> k;
  64. init();
  65. for (int h = 1; h < n; h++)
  66. solve(h, k - 1, h - 1, k - 1, h);
  67. cout << dp[n - 1][k - 1];
  68. return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement