/* 动态规划问题 找出一个数字序列中最长的不下降序列 用dp[i]存储序列中以i结尾的最长的不下降序列的长度 则对于s[i] 以s[i]结尾的最长不下降序列的长度就是MAX{dp[s[j]]}+1 (s[j]<=s[i]&&j==0...i-1) 以sublen记录最大的dp[i]即为最长的不下降序列的长度 第一道dp题。。。 */ #define LOCAL #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<iomanip> #include<string> #include<algorithm> #include<ctime> #include<stack> #include<queue> #include<vector> #define N 1005 using namespace std; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int ncase,slen,sublen,first=1,i,j,dp[N*10],s[N],found; cin>>ncase; while(ncase--) { cin.get(); cin>>slen; for(i=0;i<slen;i++) cin>>s[i]; memset(dp,0,sizeof(dp)); dp[s[0]]=1;sublen=1; for(i=1;i<slen;i++) { found=0; for(j=0;j<i;j++) { if(s[j]<s[i]&&dp[s[j]]+1>dp[s[i]]) {dp[s[i]]=dp[s[j]]+1;if(dp[s[i]]>sublen) sublen=dp[s[i]];found=1;} } if(!found){dp[s[i]]=1;} } if(first){first=0;} else{cout<<endl;} cout<<sublen<<endl; } return 0; }