#include <bits/stdc++.h>
using namespace std;
const int N = 15005;
const int M = 100005;
const int INF = 0x7f7f7f7f;
struct Edge {
  int from, to, flow, cap, cost;
};
struct mcmf {
  int n, m, s, t;
  vector<Edge> Edges;
  vector<int> g[N];
  int p[N], df[N], w[N];
  bool vis[N];
  void init(int n) {
    this->n = n;
    for (int i = 1; i <= n; i++) g[i].clear();
    Edges.clear();
  }
  void addEdge(int u, int v, int c, int w) {
    Edges.push_back((Edge){u, v, 0, c, w});
    Edges.push_back((Edge){v, u, 0, 0, -w});
    m = Edges.size();
    g[u].push_back(m - 2);
    g[v].push_back(m - 1);
  }
  int spfa() {
    for (int i = 1; i <= n; i++) {
      df[i] = 0;
      vis[i] = 0;
      w[i] = INF;
    }
    queue<int> Q;
    df[s] = INF, vis[s] = 1, w[s] = 0;
    Q.push(s);
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      vis[u] = 0;
      for (auto &x : g[u]) {
        Edge &e = Edges[x];
        if (e.cap > e.flow && w[e.to] > w[u] + e.cost) {
          p[e.to] = x;
          df[e.to] = min(df[e.from], e.cap - e.flow);
          w[e.to] = w[u] + e.cost;
          if (!vis[e.to]) {
            vis[e.to] = 1;
            Q.push(e.to);
          }
        }
      }
    }
    for (int u = t; u != s; u = Edges[p[u]].from) {
      Edges[p[u]].flow += df[t];
      Edges[p[u] ^ 1].flow -= df[t];
    }
    return w[t];
  }
  int mcf(int s, int t) {
    this->s = s;
    this->t = t;
    int F = 0, ret = 0;
    while (F < 4) {
      F++;
      ret -= spfa();
    }
    return ret;
  }
} T;
int n, a[N], lastval[M], lastmod[7];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  T.init(5 * n + 2);
  for (int i = n; i; i--) {
    if (lastval[a[i] + 1]) {
      T.addEdge(n + i, 2 * n + lastval[a[i] + 1], 1, 0);
      T.addEdge(2 * n + i, 2 * n + lastval[a[i] + 1], 1, 0);
    }
    if (lastval[a[i] - 1]) {
      T.addEdge(n + i, 3 * n + lastval[a[i] - 1], 1, 0);
      T.addEdge(3 * n + i, 3 * n + lastval[a[i] - 1], 1, 0);
    }
    lastval[a[i]] = i;
    if (lastmod[a[i] % 7]) {
      T.addEdge(n + i, 4 * n + lastmod[a[i] % 7], 1, 0);
      T.addEdge(4 * n + i, 4 * n + lastmod[a[i] % 7], 1, 0);
    }
    lastmod[a[i] % 7] = i;
  }
  for (int i = 1; i <= n; i++) {
    T.addEdge(i, n + i, 1, -1);
    T.addEdge(5 * n + 1, i, 1, 0);
    T.addEdge(n + i, 5 * n + 2, 1, 0);
    for (int j = 2; j <= 4; j++) T.addEdge(j * n + i, i, 1, 0);
  }
  printf("%d\n", T.mcf(5 * n + 1, 5 * n + 2));
  return 0;
}
