#include <bits/stdc++.h>
using namespace std;
inline int rd(int f = 1, int x = 0, char ch = ' ') {
  while (!isdigit(ch = getchar()))
    if (ch == '-') f = -1;
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f * x;
}
const int N = 8e1 + 5, oo = 0x3f3f3f3f;
int n, m, a[N], f[N * N][N], g[N * N][N], ans[N * N];
inline int G(int x) { return x * (x - 1) / 2; }
inline void mmin(int &x, int y) { x < y ? 0 : x = y; }
inline void mmax(int &x, int y) { x > y ? 0 : x = y; }
int main() {
  n = rd(), memset(f, 0x3f, sizeof(f)), f[0][0] = 0;
  for (int i = 1; i <= n; ++i) a[i] = rd();
  a[n + 1] = 1;
  for (int i = 1; i <= n + 1; ++i)
    if (!a[i])
      ++m;
    else {
      for (int j = 0; j <= G(n); ++j)
        memcpy(g[j], f[j], sizeof(int) * (n + 2)),
            memset(f[j], 0x3f, sizeof(int) * (n + 2));
      for (int j = 0; j <= G(n); ++j)
        for (int p = 0; p <= n; ++p)
          if (g[j][p] != oo)
            for (int q = p + 1; q <= n + 1; ++q)
              if (abs(q - i) + j <= G(n))
                mmin(f[j + abs(q - i)][q], g[j][p] + G(q - p - 1));
    }
  for (int j = 0; j <= G(n); ++j) ans[j] = max(ans[j], G(m) - f[j][n + 1]);
  for (int j = 1; j <= G(n); ++j) mmax(ans[j], ans[j - 1]);
  for (int j = 0; j <= G(n); ++j) printf("%d ", ans[j]);
  puts("");
  return 0;
}
