从头开始找一遍最长上升子序列,把数组反转再找一遍最长上升子序列
#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 ; }