num个数,1 - num 。A[i]代表第i个人的身高,第i个人只能看见他前面的比他高的,也就是从第i个人到头找最长上升子序列,Case为50000所以需要优化,用id表示从i能看见的最高人的的位置。
#include <iostream>
#include <cstring>
using namespace std;
int Case, A[50005], dp[50005], num;
int main ( ) {
cin >> Case;
while ( Case-- ) {
memset ( A, 0 , sizeof ( A ) );
int id = 1, Max = 0;
cin >> num;
for ( int i = 1; i <= num; cin >> A[i], ++i ) ;
dp[1] = 0;
for ( int i = 2; i <= num; ++i ) {
if ( A[i - 1] > A[i] ) dp[i] = dp[i - 1] + 1;
else if ( A[i] < A[id] ) {
for ( int j = i - 1; j >= id; --j )
if ( A[j] > A[i] ) {
dp[i] = dp[j] + 1;
break;
}
}
else {
dp[i] = 0;
id = i;
}
Max = max ( Max, dp[i] );
}
cout << Max << endl;
}
return 0;
}