#include <bits/stdc++.h>   using namespace std;   template <class Flow = int, class Cost = int>   struct MinCostFlow {     const Flow INF_FLOW = 1000111000;     const Cost INF_COST = 1000111000111000LL;     int n, t, S, T;     Flow totalFlow;     Cost totalCost;     vector<int> last, visited;     vector<Cost> dis;     struct Edge {       int to;       Flow cap;       Cost cost;       int next;       Edge(int to, Flow cap, Cost cost, int next)           : to(to), cap(cap), cost(cost), next(next) {}     };     vector<Edge> edges;     MinCostFlow(int n)         : n(n),           t(0),           totalFlow(0),           totalCost(0),           last(n, -1),           visited(n, 0),           dis(n, 0) {       edges.clear();     }     int addEdge(int from, int to, Flow cap, Cost cost) {       edges.push_back(Edge(to, cap, cost, last[from]));       last[from] = t++;       edges.push_back(Edge(from, 0, -cost, last[to]));       last[to] = t++;       return t - 2;     }     pair<Flow, Cost> minCostFlow(int _S, int _T) {       S = _S;       T = _T;       SPFA();       while (1) {         while (1) {           for (int i = 0; i < n; i++) visited[i] = 0;           if (!findFlow(S, INF_FLOW)) break;         }         if (!modifyLabel()) break;       }       return make_pair(totalFlow, totalCost);     }       private:     void SPFA() {       for (int i = 0; i < n; i++) dis[i] = INF_COST;       priority_queue<pair<Cost, int> > Q;       Q.push(make_pair(dis[S] = 0, S));       while (!Q.empty()) {         int x = Q.top().second;         Cost d = -Q.top().first;         Q.pop();         if (dis[x] != d) continue;         for (int it = last[x]; it >= 0; it = edges[it].next)           if (edges[it].cap > 0 && dis[edges[it].to] > d + edges[it].cost)             Q.push(make_pair(-(dis[edges[it].to] = d + edges[it].cost),                              edges[it].to));       }       Cost disT = dis[T];       for (int i = 0; i < n; i++) dis[i] = disT - dis[i];     }     Flow findFlow(int x, Flow flow) {       if (x == T) {         totalCost += dis[S] * flow;         totalFlow += flow;         return flow;       }       visited[x] = 1;       Flow now = flow;       for (int it = last[x]; it >= 0; it = edges[it].next)         if (edges[it].cap && !visited[edges[it].to] &&             dis[edges[it].to] + edges[it].cost == dis[x]) {           Flow tmp = findFlow(edges[it].to, min(now, edges[it].cap));           edges[it].cap -= tmp;           edges[it ^ 1].cap += tmp;           now -= tmp;           if (!now) break;         }       return flow - now;     }     bool modifyLabel() {       Cost d = INF_COST;       for (int i = 0; i < n; i++)         if (visited[i])           for (int it = last[i]; it >= 0; it = edges[it].next)             if (edges[it].cap && !visited[edges[it].to])               d = min(d, dis[edges[it].to] + edges[it].cost - dis[i]);       if (d == INF_COST) return false;       for (int i = 0; i < n; i++)         if (visited[i]) dis[i] += d;       return true;     }   };   int main() {     int n;     scanf( %d , &n);     int a[n];     for (int i = 0; i < n; i++) scanf( %d , &a[i]);     MinCostFlow<int, long long> mcf(3 * (n + 2));     mcf.addEdge(0, 1, 4, 0);     mcf.addEdge(3 * (n + 1), 3 * (n + 1) + 1, 4, 0);     for (int i = 0; i < n; i++) {       mcf.addEdge(1, (i + 1) * 3, 1, 0);       mcf.addEdge((i + 1) * 3, (i + 1) * 3 + 1, 1, -1);       mcf.addEdge((i + 1) * 3 + 2, (i + 1) * 3, 1, 0);       mcf.addEdge((i + 1) * 3 + 1, (n + 1) * 3, 1, 0);       int u, d, l;       u = d = l = 0;       for (int j = i + 1; j < n; j++) {         if (a[j] + 1 == a[i] && d < 4) {           mcf.addEdge(3 * (i + 1) + 1, 3 * (j + 1), 1, 0);           d++;         } else if (a[j] - 1 == a[i] && u < 4) {           mcf.addEdge(3 * (i + 1) + 1, 3 * (j + 1), 1, 0);           u++;         } else if (!((a[i] - a[j]) % 7) && !l) {           mcf.addEdge(3 * (i + 1) + 1, 3 * (j + 1) + 2, 1, 0);           mcf.addEdge(3 * (i + 1) + 2, 3 * (j + 1) + 2, 1, 0);           l = 1;         }       }     }     pair<int, int> mcmf = mcf.minCostFlow(0, 3 * (n + 1) + 1);     if (mcmf.first == 4)       cout << -mcmf.second << endl;     else       cout << 0 << endl;     return 0;   }