using
System;
class
GFG
{
static
int
f(
int
i,
int
state,
int
[]A,
int
[,]dp,
int
N)
{
if
(i >= N)
return
0;
else
if
(dp[i, state] != -1)
{
return
dp[i, state];
}
else
{
if
(i == N - 1)
dp[i, state] = 1;
else
if
(state == 1 && A[i] > A[i + 1])
dp[i, state] = 1;
else
if
(state == 2 && A[i] < A[i + 1])
dp[i, state] = 1;
else
if
(state == 1 && A[i] <= A[i + 1])
dp[i, state] = 1 + f(i + 1, 2, A, dp, N);
else
if
(state == 2 && A[i] >= A[i + 1])
dp[i, state] = 1 + f(i + 1, 1, A, dp, N);
return
dp[i, state];
}
}
static
int
maxLenSeq(
int
[]A,
int
N)
{
int
i, j, tmp, y, ans;
int
[,]dp =
new
int
[1000, 3];
for
(i = 0; i < 1000; i++)
for
(j = 0; j < 3; j++)
dp[i, j] = -1;
for
(i = 0; i < N; i++)
{
tmp = f(i, 1, A, dp, N);
tmp = f(i, 2, A, dp, N);
}
ans = -1;
for
(i = 0; i < N; i++)
{
y = dp[i, 1];
if
(i + y >= N)
ans = Math.Max(ans, dp[i, 1] + 1);
else
if
(y % 2 == 0)
{
ans = Math.Max(ans, dp[i, 1] + 1 +
dp[i + y, 2]);
}
else
if
(y % 2 == 1)
{
ans = Math.Max(ans, dp[i, 1] + 1 +
dp[i + y, 1]);
}
}
return
ans;
}
public
static
void
Main (String[] args)
{
int
[]A = { 1, 10, 3, 20, 25, 24 };
int
n = A.Length;
Console.WriteLine(maxLenSeq(A, n));
}
}