原题链接
题意:
n个数,求像图片中这样回文子序列的最大长度,x,y,z可以为0
全程做假题,最后百思不得其解,看题解才发现题意都读错了…
思路:
因为限定了最多只能出现两种不一样的数,所以直接枚举两边那个数的种类和长度就可以了,双指针把每种数跑一遍,然后用前缀和跑一下中间那个数的最大贡献,一时之间竟然想不到什么做法可以过E1卡E2
#include<bits/stdc++.h>
#define LL long long
#define INF INT64_MAX
#define MOD 998244353
#define ls rt << 1
#define rs rt << 1 | 1
using namespace std;
typedef pair<int,int>pa;
const int N = 2e5+7;
int a[N], sq[205][N];
vector<int > v[205];
int main()
{
int t, n, x;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
v[a[i]].push_back(i);
for(int j = 1;j <= 200;j++)
{
if(j==a[i]) sq[j][i] = sq[j][i-1]+1;
else sq[j][i] = sq[j][i-1];
}
}
int ans = 1;
for(int i = 1;i <= 200;i++)
{
if(v[i].empty()) continue;
int l = 0, sz = v[i].size();
int r = sz-1, cnt = 1;
while(l<r)
{
for(int j = 1;j <= 200;j++)
{
ans = max(ans, cnt*2 + sq[j][v[i][r]-1]-sq[j][v[i][l]]);
}
l++, r--, cnt++;
}
v[i].clear();
}
printf("%d\n", ans);
}
return 0;
}