#include <bits/stdc++.h>   using namespace std;   const int N = 5e5 + 5;   const int inf = ~0U >> 1;   template <class U, class V>   struct MCMF {     static const int N = 8000, M = 7001010;     int h[N], ing[N], pre[N], to[M], ne[M], e, s, t, n;     U cap[M];     V dis[N], cost[M];     void ini(int _n = N) {       fill(h, h + (n = _n), -1);       e = 0;     }     void liu(int u, int v, U c, V w) {       to[e] = v;       ne[e] = h[u];       cap[e] = c;       cost[e] = w;       h[u] = e++;     }     void link(int u, int v, U c, V w) {       liu(u, v, c, w);       liu(v, u, 0, -w);     }     bool spfa() {       queue<int> Q;       fill(dis, dis + n, -inf);       Q.push(s), ing[s] = 1, dis[s] = 0;       while (!Q.empty()) {         int c = Q.front();         Q.pop();         ing[c] = 0;         for (int k = h[c]; ~k; k = ne[k])           if (cap[k] > 0) {             int v = to[k];             if (dis[c] + cost[k] > dis[v]) {               dis[v] = dis[c] + cost[k];               pre[v] = k;               if (!ing[v]) Q.push(v), ing[v] = 1;             }           }       }       return dis[t] != -inf;     }     U flow;     V mincost;     pair<U, V> run(int _s, int _t) {       s = _s, t = _t;       flow = mincost = 0;       while (spfa()) {         U pl = inf;         int p, k;         for (p = t; p != s; p = to[k ^ 1]) pl = min(pl, cap[k = pre[p]]);         for (p = t; p != s; p = to[k ^ 1])           cap[k = pre[p]] -= pl, cap[k ^ 1] += pl;         mincost += pl * dis[t];         flow += pl;       }       return make_pair(flow, mincost);     }   };   MCMF<int, int> flow;   int n, a[N];   int can[3005][3005];   int main() {     scanf( %d , &n);     for (int i = (1); i < (n + 1); i++) {       scanf( %d , &a[i]);     }     flow.ini(n * 2 + 100);     int t = flow.n - 1, s = t - 1, ss = s - 1;     ;     for (int i = (1); i < (n + 1); i++) {       flow.link(i, i + n, 1, 1);       flow.link(i, i + n, inf, 0);       int f1 = 1, f2 = 1, f3 = 1;       for (int j = (i + 1); j < (n + 1); j++) {         if (a[j] - a[i] == 1 && f1) {           f1 = 0;           flow.link(i + n, j, 1, 0);         }         if (a[i] - a[j] == 1 && f2) {           f2 = 0;           flow.link(i + n, j, 1, 0);         }         if (a[i] - a[j] == 0 && f3) {           f3 = 0;           flow.link(i + n, j, 1, 0);         }       }     }     for (int j = (0); j < (7); j++) {       int pre = 0;       for (int i = (1); i < (n + 1); i++) {         if (a[i] % 7 == j) {           if (pre) flow.link(pre + n, i, 1, 0);           pre = i;         }       }     }     for (int i = (1); i < (n + 1); i++)       flow.link(ss, i, 1, 0), flow.link(i + n, t, 1, 0);     flow.link(s, ss, 4, 0);     int ans = flow.run(s, t).second;     printf( %d n , ans);     return 0;   }   