#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int t; int n; #define MAX 102 int a[MAX]; vector > v[MAX]; //cost,go bool use[MAX][MAX]; int dp[MAX][MAX]; inline void dfs(int aa, int b){ if (use[aa][b]){ return; } use[aa][b] = true; dp[aa][b] = 0; int pre = a[b] - a[aa]; if (aa == b){ pre = INT_MAX; } int ind = lower_bound(v[aa].begin(), v[aa].end(), make_pair(pre, -1))-v[aa].begin(); ind--; for (int i = ind; i>=0; i--){ dfs(v[aa][i].second, aa); dp[aa][b] = max(dp[aa][b], dp[v[aa][i].second][aa]); } dp[aa][b]++; } int dp2[MAX][MAX]; inline void dfs2(int aa, int b){ if (use[aa][b]){ return; } use[aa][b] = true; dp2[aa][b] = 0; int pre = a[b] - a[aa]; if (aa == b){ pre = INT_MAX; } int ind = lower_bound(v[aa].begin(), v[aa].end(), make_pair(pre, -1)) - v[aa].begin(); ind--; for (int i = ind; i>=0; i--){ dfs2(v[aa][i].second, aa); dp2[aa][b] = max(dp2[aa][b], dp2[v[aa][i].second][aa]); } dp2[aa][b]++; } int main(){ scanf("%d", &t); while (t--){ scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &a[i]); } for (int i = 0; i < n; i++){ v[i].clear(); } for (int i = 0; i < n; i++){ for (int j = i + 1; j < n; j++){ if (a[i] > a[j]){ v[i].push_back(make_pair(a[i] - a[j],j)); } } } for (int i = 0; i < n; i++){ sort(v[i].begin(), v[i].end()); } memset(use, false, sizeof(use)); for (int i = 0; i < n; i++){ dfs2(i, i); } for (int i = 0; i < n; i++){ v[i].clear(); } for (int i = 0; i < n; i++){ for (int j = i - 1; j >= 0; j--){ if (a[i]>a[j]){ v[i].push_back(make_pair(a[i] - a[j], j)); } } } for (int i = 0; i < n; i++){ sort(v[i].begin(), v[i].end()); } memset(use, false, sizeof(use)); int maxt = 1; for (int i = 0; i < n; i++){ dfs(i, i); maxt = max(maxt, dp[i][i] + dp2[i][i] - 1); } printf("%d\n", maxt); } return 0; }