#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 5e2 + 5;
const int M = 1e3 + 5;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
inline long long qsm(long long x, long long y) {
  long long res = 1;
  while (y) {
    if (y & 1) res = res * x % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return res;
}
int n, m;
int a[N];
struct node {
  int l, r, len;
} f[N][N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    f[i][i].l = f[i][i].r = a[i];
    f[i][i].len = 1;
  }
  for (int s = 2; s <= n; s++)
    for (int i = 1; i <= n - s + 1; i++) {
      int j = i + s - 1;
      f[i][j].l = a[i];
      f[i][j].r = a[j];
      f[i][j].len = s;
      for (int k = i; k <= j - 1; k++) {
        if (f[i][k].r == f[k + 1][j].l) {
          if (f[i][j].len > f[i][k].len + f[k + 1][j].len - 1) {
            f[i][j].len = f[i][k].len + f[k + 1][j].len - 1;
            f[i][j].l = f[i][k].l;
            f[i][j].r = f[k + 1][j].r;
            if (f[i][k].len == 1) ++f[i][j].l;
            if (f[k + 1][j].len == 1) ++f[i][j].r;
          }
        } else if (f[i][j].len > f[i][k].len + f[k + 1][j].len) {
          f[i][j].len = f[i][k].len + f[k + 1][j].len;
          f[i][j].l = f[i][k].l;
          f[i][j].r = f[k + 1][j].r;
        }
      }
    }
  printf("%d\n", f[1][n].len);
  return 0;
}
