题意:给一个长度为m的序列,从里面选出一些数,相对位置不发生变化,并满足a[i]=a[n-i],a[1]<a[2]<...<a[(n+1)/2],n是数的个数,求最大的n
思路:dp[i][j]表示0~i,j~m的答案,则dp[i][j]=dp[l][r]+1+(i<j),其中a[i]=a[j]>a[l]=a[r]&&l<i<=j<r。枚举3个变量i,j,r,维护一个l就行了,o(m^3)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/* ******************************************************************************** */
#include <iostream> //
#include <cstdio> //
#include <cmath> //
#include <cstdlib> //
#include <cstring> //
#include <vector> //
#include <ctime> //
#include <deque> //
#include <queue> //
#include <algorithm> //
using
namespace
std;
//
//
#define pb push_back //
#define mp make_pair //
#define X first //
#define Y second //
#define all(a) (a).begin(), (a).end() //
#define foreach(i, a) for (typeof(a.begin()) it = a.begin(); it != a.end(); it ++) //
//
void
RI(vector<
int
>&a,
int
n){a.resize(n);
for
(
int
i=0;i<n;i++)
scanf
(
"%d"
,&a[i]);}
//
void
RI(){}
void
RI(
int
&X){
scanf
(
"%d"
,&X);}
template
<
typename
...R>
//
void
RI(
int
&f,R&...r){RI(f);RI(r...);}
void
RI(
int
*p,
int
*q){
int
d=p<q?1:-1;
//
while
(p!=q){
scanf
(
"%d"
,p);p+=d;}}
void
print(){cout<<endl;}
template
<
typename
T>
//
void
print(
const
T t){cout<<t<<endl;}
template
<
typename
F,
typename
...R>
//
void
print(
const
F f,
const
R...r){cout<<f<<
", "
;print(r...);}
template
<
typename
T>
//
void
print(T*p, T*q){
int
d=p<q?1:-1;
while
(p!=q){cout<<*p<<
", "
;p+=d;}cout<<endl;}
//
//
typedef
pair<
int
,
int
> pii;
//
typedef
long
long
ll;
//
typedef
unsigned
long
long
ull;
//
//
/* -------------------------------------------------------------------------------- */
//
template
<
typename
T>
bool
umax(T &a,
const
T &b) {
return
a >= b?
false
: (a = b,
true
);
}
int
a[300], dp[300][300];
int
main() {
#ifndef ONLINE_JUDGE
freopen
(
"in.txt"
,
"r"
, stdin);
#endif // ONLINE_JUDGE
int
T;
RI(T);
while
(T --) {
int
n;
RI(n);
RI(a + 1, a + 1 + n);
int
p[300] = {};
memset
(dp, 0,
sizeof
(dp));
int
ans = 0;
for
(
int
i = 1; i <= n; i ++) {
for
(
int
j = n; j >= i; j --) {
if
(a[i] != a[j])
continue
;
dp[i][j] = 1 + (i < j);
for
(
int
k = j + 1; k <= n; k ++) {
if
(a[k] < a[i]) {
if
(p[a[k]] && p[a[k]] < i)
umax(dp[i][j], dp[p[a[k]]][k] + 1 + (i < j));
}
}
umax(ans, dp[i][j]);
}
p[a[i]] = i;
}
cout << ans << endl;
}
return
0;
//
}
//
//
//
//
/* ******************************************************************************** */
|