#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e3 + 5;
int n;
int nxt[10][MAX];
int sz[1 << 8];
vector<int> pos[10];
vector<int> perm;
inline bool ok(int k, int mask = 0) {
  int p = 0;
  for (auto &each : perm) {
    int idx = nxt[each][p];
    int kk = k + ((mask >> (each - 1)) & 1);
    if (kk == 0) {
      continue;
    }
    if (idx == -1 || (idx + kk > (int)pos[each].size())) {
      return false;
    }
    p = pos[each][idx + kk - 1];
  }
  return true;
}
int main() {
  scanf("%d", &n);
  for (int i = int(1); i < int(n + 1); i++) {
    int cur;
    scanf("%d", &cur);
    pos[cur].push_back(i);
  }
  memset(nxt, -1, sizeof nxt);
  for (int i = int(1); i < int(8 + 1); i++) {
    int ptr = 0;
    for (int j = int(0); j < int(n + 1); j++) {
      while (ptr < (int)pos[i].size() && pos[i][ptr] <= j) {
        ptr++;
      }
      if (ptr != (int)pos[i].size()) {
        nxt[i][j] = ptr;
      }
    }
  }
  for (int i = int(0); i < int(1 << 8); i++) {
    sz[i] = __builtin_popcount(i);
  }
  for (int i = int(1); i < int(8 + 1); i++) {
    perm.push_back(i);
  }
  int ans = 0;
  do {
    int left = 1, right = n;
    int best = 0;
    while (left <= right) {
      int mid = (left + right) / 2;
      if (ok(mid)) {
        best = mid;
        left = mid + 1;
      } else {
        right = mid - 1;
      }
    }
    ans = max(ans, best * 8);
    for (int i = int(1); i < int(1 << 8); i++) {
      if (ok(best, i)) {
        ans = max(ans, best * 8 + sz[i]);
      }
    }
  } while (next_permutation(perm.begin(), perm.end()));
  printf("%d\n", ans);
  return 0;
}
