#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int mm = 66666;
const int maxn = 9999;
int node, src, dest, edge;
int ver[mm], flow[mm], cst[mm], nxt[mm];
int head[maxn], work[maxn], dis[maxn], q[maxn];
int tot_cost;
void prepare(int _node, int _src, int _dest) {
  node = _node, src = _src, dest = _dest;
  for (int i = 0; i < node; ++i) head[i] = -1;
  edge = 0;
  tot_cost = 0;
}
void addedge(int u, int v, int c, int cost) {
  ver[edge] = v, flow[edge] = c, nxt[edge] = head[u], cst[edge] = cost,
  head[u] = edge++;
  ver[edge] = u, flow[edge] = 0, nxt[edge] = head[v], cst[edge] = -cost,
  head[v] = edge++;
}
int ins[maxn];
int pre[maxn];
bool Dinic_spfa() {
  memset(ins, 0, sizeof(ins));
  memset(dis, inf, sizeof(dis));
  memset(pre, -1, sizeof(pre));
  queue<int> Q;
  Q.push(src);
  dis[src] = 0, ins[src] = 1;
  pre[src] = -1;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    ins[u] = 0;
    for (int e = head[u]; e != -1; e = nxt[e]) {
      int v = ver[e];
      if (!flow[e]) continue;
      if (dis[v] > dis[u] + cst[e]) {
        dis[v] = dis[u] + cst[e];
        pre[v] = e;
        if (!ins[v]) ins[v] = 1, Q.push(v);
      }
    }
  }
  return dis[dest] < inf;
}
int Dinic_flow() {
  int i, ret = 0, delta = inf;
  while (Dinic_spfa()) {
    for (int i = pre[dest]; i != -1; i = pre[ver[i ^ 1]])
      delta = min(delta, flow[i]);
    for (int i = pre[dest]; i != -1; i = pre[ver[i ^ 1]])
      flow[i] -= delta, flow[i ^ 1] += delta;
    ret += delta;
    tot_cost += dis[dest] * delta;
  }
  return ret;
}
int n;
int a[3333];
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
  prepare(3 + 3 * n, 0, 1 + 3 * n);
  addedge(0, 2 + 3 * n, 4, 0);
  for (int i = 0; i < n; ++i) {
    addedge(2 + 3 * n, i * 3 + 1, 1, 0);
    addedge(i * 3 + 1, i * 3 + 2, 1, -1);
    addedge(i * 3 + 1, i * 3 + 3, inf, 0);
    addedge(i * 3 + 2, i * 3 + 3, 1, 0);
    addedge(i * 3 + 3, 1 + 3 * n, 1, 0);
  }
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      if (a[i] == a[j] + 1) {
        addedge(i * 3 + 3, j * 3 + 1, inf, 0);
        break;
      }
    }
    for (int j = i + 1; j < n; ++j) {
      if (a[i] == a[j] - 1) {
        addedge(i * 3 + 3, j * 3 + 1, inf, 0);
        break;
      }
    }
    for (int j = i + 1; j < n; ++j) {
      if (abs(a[i] - a[j]) % 7 == 0) {
        addedge(i * 3 + 3, j * 3 + 1, inf, 0);
        break;
      }
    }
  }
  int maxf = Dinic_flow();
  cout << -tot_cost << endl;
  return 0;
}
