从头开始找一遍最长上升子序列,把数组反转再找一遍最长上升子序列
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std ;
const int N = 110 ;
int n , t ;
int dp[N] ;
int a[N] ;
int b[N] ;
int main(){
cin >> t ;
while(t--){
cin >> n ;
for(int i = 1 ; i <= n ; i ++) cin >> a[i] ;
memset(dp,0,sizeof(dp)) ;
for(int i = 1 ; i<= n ; i ++) {
dp[i] ++ ;
for(int j = 1 ; j <= i ; j ++){
if(a[i] > a[j]) dp[i] = max(dp[i],dp[j] + 1) ;
}
}
int ans = 0 ;
for(int i = 1 ; i <= n ; i ++) ans = max(ans ,dp[i]) ;
memset(dp,0,sizeof(dp)) ;
for(int i = 1 ; i <= n ; i ++) b[i] = a[n-i+1] ;
for(int i = 1 ; i <= n ;i ++){
dp[i] ++ ;
for(int j = 1 ; j <= i ; j ++){
if(b[i] > b[j] ) dp[i] = max(dp[i],dp[j] + 1) ;
}
}
for(int i = 1 ; i <= n ; i ++) ans = max(ans, dp[i]) ;
cout << ans << endl ;
}
return 0 ;
}