#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int inf = 1e9;
const long long mod = 998244353;
template <class T>
void Mul(T &x, T y) {
  x = x * y % mod;
}
template <class T>
void Add(T &x, T y) {
  x = (x + y) % mod;
}
template <class T>
void Sub(T &x, T y) {
  x = (x - y + mod) % mod;
}
template <class T>
void Mn(T &x, T y) {
  x = min(x, y);
}
template <class T>
void Mx(T &x, T y) {
  x = max(x, y);
}
int n, m, k, T;
int a[N], num, posA[N];
bool rem[7000][100];
int calc(int x) { return x * (x - 1) / 2; }
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  num = 0;
  for (int i = 1; i <= n; i++) {
    if (a[i] == 0) {
      posA[++num] = i;
    }
  }
  vector<vector<vector<int>>> bf(1, vector<vector<int>>(1, vector<int>(1)));
  bf[0][0][0] = 0;
  memset(rem, 0, sizeof rem);
  rem[0][0] = 1;
  int lim1 = 0, lim3 = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= lim3; j++) {
      for (int k = max(0, num - n + i - 1); k <= i && k < num; k++) {
        if (rem[j][k]) Mx(lim1, j + abs(i - posA[k + 1]));
      }
    }
    vector<vector<vector<int>>> nw(
        i + 1, vector<vector<int>>(i + 1, vector<int>(lim1 + 1)));
    for (int c1 = 0; c1 <= i && c1 <= num; c1++) {
      for (int c2 = max(0, num - c1 - n + i); c2 <= i && c2 <= num; c2++) {
        for (int c3 = 0; c3 <= lim1; c3++) {
          nw[c1][c2][c3] = inf;
        }
      }
    }
    for (int al = 0, lim2; al < i && al <= num; al++) {
      lim2 = min(i - al - 1, num - al);
      for (int cons = max(0, num - al - n + i - 1); cons <= lim2; cons++) {
        for (int dis = 0; dis <= lim3; dis++) {
          if (bf[al][cons][dis] == inf) continue;
          if (al + cons < num)
            Mn(nw[al][cons + 1][dis + abs(i - posA[al + cons + 1])],
               bf[al][cons][dis]),
                rem[dis + abs(i - posA[al + cons + 1])][al + cons + 1] = 1;
          Mn(nw[al + cons][0][dis], bf[al][cons][dis] + calc(cons));
        }
      }
    }
    swap(bf, nw), lim3 = lim1;
  }
  int tot = calc(num), lim = n * (n - 1) / 2, mx = 0;
  for (int dis = 0; dis <= lim; dis++) {
    int res = 0;
    if (dis <= lim3) {
      for (int al = 0, cons; al <= num; al++) {
        cons = num - al;
        if (bf[al][cons][dis] == inf) continue;
        Mx(res, tot - (bf[al][cons][dis] + calc(cons)));
      }
    }
    Mx(mx, res);
    cout << mx << ' ';
  }
  cout << '\n';
}
