Advertisement
incapabilis

Untitled

Nov 26th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. //Let we have sorted array x, and want to recalculate DP
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. const int N = 5e3 + 10;
  7. const int INF = 1e9;
  8.  
  9. int n, dp[N], x[N];
  10. int go[N][N][2][2];
  11.  
  12. void calc(int l, int r) {
  13. if (r - l == 1) {
  14. go[l][r][0][0] = x[r] - x[l];
  15. go[l][r][0][1] = go[l][r][1][0] = INF;
  16. return;
  17. }
  18. if (r - l == 2) {
  19. go[l][r][0][0] = x[r] - x[l];
  20. go[l][r][0][1] = x[r - 1] - x[l];
  21. go[l][r][1][0] = x[r] - x[l + 1];
  22. go[l][r][1][1] = INF;
  23. return;
  24. }
  25. int m = (l + r) / 2;
  26. calc(l, m);
  27. calc(m + 1, r);
  28. for (int dl = 0; dl <= 1; ++dl) {
  29. for (int dr = 0; dr <= 1; ++dr) {
  30. int cur = INF;
  31. cur = min(cur, go[l][m][dl][0] + go[m + 1][r][0][dr]);
  32. cur = min(cur, go[l][m][dl][1] + go[m + 1][r][0][dr] + x[m + 1] - x[m]);
  33. cur = min(cur, go[l][m][dl][0] + go[m + 1][r][1][dr] + x[m + 1] - x[m]);
  34. cur = min(cur, go[l][m][dl][1] + go[m + 1][r][1][dr] + x[m + 1] - x[m]);
  35. go[l][r][dl][dr] = cur;
  36. }
  37. }
  38. }
  39.  
  40. int main() {
  41. int n;
  42. cin >> n;
  43. for (int i = 1; i <= n; ++i) {
  44. cin >> x[i];
  45. }
  46. sort(x + 1, x + n + 1);
  47. calc(1, n);
  48. cout << go[1][n][0][0] << '\n';
  49. return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement