module main; // https://kmjp.hatenablog.jp/entry/2015/01/14/0900 より // 動的計画法 import std; // aとbを比較してbの方が大きいならばaの値をbに更新する void chMax(T)(ref T a, in T b) { if (a < b) a = b; } void main() { // 入力 int N = readln.chomp.to!int; auto A = readln.split.to!(int[]); // 答えの計算 int ma = 1; auto dp = new int[][][](2, N + 2, N + 2); foreach (i; 0 .. N) dp[0][i][i] = dp[1][i][i] = 1; foreach (i; 1 .. N + 1) { foreach (x; 0 .. N - i) { chMax(dp[1][x][x + i], dp[1][x][x + i - 1]); chMax(dp[0][x][x + i], dp[0][x + 1][x + i]); if (A[x] < A[x + i]) chMax(dp[1][x][x + i], dp[0][x + 1][x + i] + 1); if (A[x] > A[x + i]) chMax(dp[0][x][x + i], dp[1][x][x + i - 1] + 1); ma = max(ma, dp[1][x][x + i], dp[0][x][x + i]); } } // 答えの出力 writeln(ma); }