吉哥系列故事——完美队形I
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,a[205],b[205],dp[205][205];
int LICS() {
int MAX, i, j, k;
memset(dp, 0, sizeof(dp));
MAX = 0;
for(i = 1; i <= n; i++) {
k = 0;//记录最长位置的下标
for(j = 1; j <= n-i+1; j++) {//找对称只需找对应的。
dp[i][j] = dp[i-1][j];//不管相不相等dp[i][j]至少等于dp[i-1][j];
if(a[i] > b[j] && dp[i-1][k] < dp[i-1][j]) {
k = j;
}
if(a[i] == b[j]) {
if(j != (n-i+1)) { //没与自身匹配
if(dp[i][j] < (dp[i-1][k] + 2))//长度加2
dp[i][j] = dp[i-1][k] + 2;
} else { //与自身匹配了
if(dp[i][j] < (dp[i-1][k] + 1))//自身所以只加1长度
dp[i][j] = dp[i-1][k] + 1;
}
}
if(MAX < dp[i][j])
MAX = dp[i][j];
}
}
return MAX;
}
int main() {
freopen("data.in", "r", stdin);
int t, i;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(i = 1; i <= n; i++)
b[i] = a[n-i+1];
printf("%d\n", LICS());
}
return 0;
}