#include<bits/stdc++.h>
using namespace std;
long long int dpsolve(std::vector<int> dec, int n){
sort(dec.begin(), dec.end());
// for(auto d: dec) cout << d <<endl; cout << "------------"<<endl;
long long int dp[n][n];
for (int i = 0; i < n; ++i)
dp[i][i] = 0LL;
// i - row is the lower index
// j - col is the higher one
// dp is sum of discrepancy from i to j
// dp[0][n-1] = arr[n-1] - arr[0] + min(dp[0][n-2], dp[1][n-1])
// dp[i][j] = arr[j] - arr[i] + min(dp[i][j-1], dp[i+1][j])
for (int i = n-1; i >= 0; --i)
{
for (int j = i+1; j < n; ++j)
{
dp[i][j] = dec[j] - dec[i] + min(dp[i][j-1], dp[i+1][j]);
}
}/*
int r = 0;
int c = n-1;
for (int i = 0; i < n; ++i)
{
if(dp[r][c-1] < dp[r+1][c])
cout << c <<endl;
else cout << r <<endl;
if(dp[r][c-1] < dp[r+1][c])
c--;
else r++;
}*/
return dp[0][n-1] ;
}
long long int grsolve(std::vector<int> dec, int n){
sort(dec.begin(), dec.end());
std::vector<long int> arr(n);
int l = 0;
int h = n-1;
for (int i = 0; i < n; ++i)
{
if((dec[h] - dec[l+1]) > (dec[h-1] - dec[l])){
arr[n-1-i] = dec[h];
h--;
}
else{
arr[n-1-i] = dec[l];
l++;
}
}
long int maximum = arr[0];
long int minimum = arr[0];
long long int sum = 0;
for (int i = 0; i < n; ++i)
{
maximum = max(maximum, arr[i]);
minimum = min(minimum, arr[i]);
sum += maximum - minimum;
}
// cout << sum << endl;
return sum;
}
std::vector<int> randomarray(int n){
std::vector<int> v(n);
for (int i = 0; i < n; ++i)
{
v[i] = rand()%100;
}
return v;
}
int main(){
int t = 100;
while(t--){
int n = rand() % 6;
std::vector<int> arr = randomarray(n);
long long int res1 = dpsolve(arr, n);
long long int res2 = grsolve(arr, n);
if(res1 == res2) {cout << "match" <<endl;}
else{
cout << "no match" << endl;
for(auto d: arr){
cout << d <<endl;
}
cout << "------------------" << endl;
break;
}
}
}