// Arup Guha
// 4/1/2016 (written in contest)
// Solution to 2015 USACO April Gold Problem: 248

import java.util.*;
import java.io.*;

public class game {

	public static int n;
	public static int[] vals;

	public static void main(String[] args) throws Exception {

		// Read in data.
		Scanner stdin = new Scanner(new File("248.in"));
		n = stdin.nextInt();
		vals = new int[n];
		for (int i=0; i<n; i++)
			vals[i] = stdin.nextInt();

        // Set up our DP.
		boolean[][][] dp = new boolean[n][n][50];
		for (int i=0; i<n; i++)
			dp[i][i][vals[i]] = true;

        // Go through each width.
		for (int width=2; width<=n; width++) {

            // And starting point.
			for (int start=0; start<n; start++) {
				int end = start+width-1;
				if (end >= n) break;

				// Finally go through each "level" (we'll never get past 50 for sure, since we need 2^k values to get to 40 + k.)
				for (int val=1; val<50; val++) {

                    // Go through each split point, like MCM DP.
					for (int mid=start; mid<end; mid++) {

						if (dp[start][mid][val-1] && dp[mid+1][end][val-1]) {
							dp[start][end][val] = true;
						}
					}


				}
			}

		}

        // Now, find the highest answer.
		int best = 0;
		for (int i=0; i<n; i++)
			for (int j=0; j<n; j++)
				for (int k=0; k<50; k++)
					if (dp[i][j][k])
						best = Math.max(best, k);

		PrintWriter out = new PrintWriter(new FileWriter("248.out"));
		out.println(best);
		out.close();
		stdin.close();
	}
}
