#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void chmin(T &l, T r) {
  l = min(l, r);
}
template <typename T>
inline void chmax(T &l, T r) {
  l = max(l, r);
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
  for (auto &it : v) is >> it;
  return is;
}
int N;
int v[1024];
int dp[256][1024];
int nxt_id[8][1024][150];
int main() {
  scanf("%d", &N);
  int res = 1;
  for (int i = (0); i < (N); i++) {
    scanf("%d", v + i);
    v[i]--;
  }
  for (int i = (0); i < (8); i++) {
    for (int j = (0); j < (N); j++) {
      int id = j;
      nxt_id[i][j][0] = id;
      for (int k = (1); k < (150); k++) {
        while (id < N && v[id] != i) id++;
        if (id == N)
          nxt_id[i][j][k] = -1;
        else {
          nxt_id[i][j][k] = ++id;
        }
      }
    }
  }
  for (int len = (0); len < (149); len++) {
    for (int bit = (0); bit < (256); bit++)
      fill(dp[bit], dp[bit] + N + 1, -114514);
    dp[0][0] = 0;
    for (int i = (0); i < (N); i++) {
      for (int bit = (0); bit < (256); bit++) {
        for (int j = (0); j < (8); j++) {
          if (bit & (1 << j))
            ;
          else {
            if (nxt_id[j][i][len] >= 0)
              chmax(dp[bit | (1 << j)][nxt_id[j][i][len]], dp[bit][i] + len);
            if (nxt_id[j][i][len + 1] >= 0)
              chmax(dp[bit | (1 << j)][nxt_id[j][i][len + 1]],
                    dp[bit][i] + len + 1);
          }
        }
      }
      res = max(res, dp[255][i + 1]);
    }
  }
  cout << res << endl;
  return 0;
}
