<aside> 💡
$dp_i = i$까지 짝수 팰린드롬으로 나눴을 때 짝수 팰린드롬의 최대 개수
짝수 팰린드롬으로 나눌 수 없다면 $-2$이다.
투포인터로 짝수 팰린드롬인지 확인 하고 짝수 팰린드롬으로 나눌 수 있다면 $dp_i$를 1개 늘린다.
</aside>
#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
using namespace std;
typedef long long int ll;
int n;
int a[5'001];
int dp[5'001];
int go(int i)
{
int &ret = dp[i];
if(ret != -1) return ret;
for(int j = i-2; j>=0; j-=2){
int prv = go(j);
if(prv == -2) continue;
bool flag = true;
int lidx = j+1;
int ridx = i;
while(lidx<ridx){
if(a[lidx] != a[ridx]){
flag = false;
break;
}
lidx++;
ridx--;
}
if(flag){
ret = max(ret, prv+1);
}
}
if(ret == -1) return ret = -2;
else return ret;
}
signed main()
{
FASTIO;
cin >> n;
for(int i = 1; i<=n; i++){
cin >> a[i];
}
memset(dp, -1, sizeof(int)*(n+1));
dp[0] = 0;
int ans = go(n);
cout << (ans!=-2?ans:-1);
return 0;
}