最长上升子序列,反过来来看,就是最长下降子序列。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 210;
int f[N];
int ff[N];
int n,k;
int a[N];
int main(){
cin >> k;
while(k--){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
memset(f,0,sizeof(f));
memset(ff,0,sizeof(ff));
int res = 1,ans = 1;
for(int i = 1; i <= n; i++){
f[i] = 1;
ff[i] = 1;
for(int j = 1; j < i; j++){//最长下降子序列
if(a[j] > a[i]){
f[i] = max(f[i], f[j] + 1);
res = max(res,f[i]);
}
}
for(int j = 1; j < i; j++){//最长上升子序列(倒着看就是最长下降子序列)
if(a[j] < a[i]){
ff[i] = max(ff[i],ff[j] + 1);
ans = max(ans,ff[i]);
}
}
// for(int j = i - 1; j >= 1; j--){
// if(a[j] < a[i]){
// ff[i] = max(ff[i], ff[j] + 1);
// ans = max(ans,ff[i]);
// }
// }
}
// for(int i = n; i >= 1; i--){
// ff[i] = 1;
// for(int j = n - 1; j > i; j--){
// if(a[j] < a[i]){
// ff[i] = max(ff[i],ff[j] + 1);
// ans = max(ans,ff[i]);
// }
// }
// }
cout << max(ans,res) << endl;//取最大值
}
return 0;
}