dp【i】【j】表示从1到i 从j到N并且以i为前半段的最右的最长的回文序列的最大长度
当num【i】== num【j】 dp【i】【j】 = max( dp【k】【j+1】) + 1;
当num【i】!= num【j】 dp【i】【j】 = dp【i】【j+1】;
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[220][220];
int num[220], N;
int main(){
int T;
scanf( "%d", &T );
while( T-- ){
scanf( "%d", &N );
for( int i = 1; i <= N; i++ ){
scanf( "%d", &num[i] );
}
// if( N == 1 ){
// printf( "1\n" );
// continue;
// }
memset( dp, 0, sizeof( dp ) );
int ans = 0;
for( int i = 1; i <= N; i++ ){
for( int j = N; j > i; j-- ){
if( num[i] == num[j] ){
int temp = 0;
for( int k = 1; k < i; k++ ){
if( num[k] < num[i] ){
temp = max( temp, dp[k][j+1] );
}
}
dp[i][j] = temp + 1;
}else{
dp[i][j] = dp[i][j+1];
}
int flag = 0;
for( int k = i + 1; k < j; k++ ){
if( num[k] > num[i] ){
flag = 1;
break;
}
}
ans = max( ans, dp[i][j] * 2 + flag );
}
}
printf( "%d\n", ans );
}
return 0;
}