Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Let we have sorted array x, and want to recalculate DP
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 5e3 + 10;
- const int INF = 1e9;
- int n, dp[N], x[N];
- int go[N][N][2][2];
- void calc(int l, int r) {
- if (r - l == 1) {
- go[l][r][0][0] = x[r] - x[l];
- go[l][r][0][1] = go[l][r][1][0] = INF;
- return;
- }
- if (r - l == 2) {
- go[l][r][0][0] = x[r] - x[l];
- go[l][r][0][1] = x[r - 1] - x[l];
- go[l][r][1][0] = x[r] - x[l + 1];
- go[l][r][1][1] = INF;
- return;
- }
- int m = (l + r) / 2;
- calc(l, m);
- calc(m + 1, r);
- for (int dl = 0; dl <= 1; ++dl) {
- for (int dr = 0; dr <= 1; ++dr) {
- int cur = INF;
- cur = min(cur, go[l][m][dl][0] + go[m + 1][r][0][dr]);
- cur = min(cur, go[l][m][dl][1] + go[m + 1][r][0][dr] + x[m + 1] - x[m]);
- cur = min(cur, go[l][m][dl][0] + go[m + 1][r][1][dr] + x[m + 1] - x[m]);
- cur = min(cur, go[l][m][dl][1] + go[m + 1][r][1][dr] + x[m + 1] - x[m]);
- go[l][r][dl][dr] = cur;
- }
- }
- }
- int main() {
- int n;
- cin >> n;
- for (int i = 1; i <= n; ++i) {
- cin >> x[i];
- }
- sort(x + 1, x + n + 1);
- calc(1, n);
- cout << go[1][n][0][0] << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement