#include <algorithm>
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
typedef long long ll;
vector<double> p, pref;
double center(int l, int r) {
    return (pref[r] - pref[l]) / (r - l);
}
int main(){
    cin.tie(0) -> sync_with_stdio(0);
    
    int n;
    cin >> n;
    
    p.resize(n + 1);
    pref.resize(n + 1, 0);
    for (int i = 1; i <= n; i++){
        cin >> p[i];
        pref[i] = pref[i - 1] + p[i];
    }
    vector<vector<pair<double, double>>> dp(n + 1, vector<pair<double,double>>(n + 1, {0, 0}));
    for (int l = 0; l < n; l++){
        double c = center(l, l + 1);
        dp[l][l + 1] = {c, c};
    }
    
    for (int len = 2; len <= n; len++){
        for (int l = 0; l + len <= n; l++){
            int r = l + len;
            double c = center(l, r);
            
            auto L = dp[l + 1][r];
            pair<double, double> currL = { min(c, L.first), max(c, L.second) };
            double q1 = currL.second - currL.first;
            
            auto R = dp[l][r - 1];
            pair<double, double> currR = { min(c, R.first), max(c, R.second) };
            double q2 = currR.second - currR.first;
            
            if (q1 < q2)
                dp[l][r] = currL;
            else
                dp[l][r] = currR;
        }
    }
    
    double res = dp[0][n].second - dp[0][n].first;
    cout << fixed << setprecision(10) << res << "\n";
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |