#include <iostream> #include <iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include <stdio.h> #include <string.h> #include <vector> #include <set> using namespace std; int v[509] , w[509] , dp[100009][100009] , a[100009] , dpp[100009], b[100009]; int len1 , len2 ; // X = (x1 , x2 , x3 ,....,xn) , Y = (y1 , y2 , y3 ,.....,ym) //最长公共子序列。将问题分为三个子问题: //当xn == ym 时, 在x(n-1) 和 y(m-1)的两个序列的最长公共子序列上加一。。 //当xn != ym 时, 比较 x(n-1) 和 y(m) 的两个序列的最长子序列 与 x(n)和y(m-1)的两个序列的最长子序列 的最大值 int main() { int n ; scanf("%d" , &n); while(n--) { int m ; scanf("%d" , &m); for(int i = 1 ; i <= m ; i++) { scanf("%d" , &a[i]); } memset(dp , 0 , sizeof(dp)); for(int i = 1 ; i <= m ; i++) { for(int j = i ; j <= m ; j++) { if(a[i] == b[j] ) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1]); } } } } return 0; }