#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
const int N = 5e2 + 5;
int n;
int c[N];
// dp(l, r, palin) = Chi phí ít nhất để xoá hết đoạn [l, r] và trước đó có đang duy trì xâu đối xứng nào hay không
int memo[N][N][2];
int dp(int l, int r, bool palin) {
if (l > r) return 0;
if (l == r) return (!palin);
int& ans = memo[l][r][palin];
if (ans != -1) return ans;
ans = INF;
// Trường hợp xoá 1 kí tự
for (int k = l; k <= r; k++) {
if (palin) {
minimize(ans, 1 + dp(l, k - 1, 1) + dp(k + 1, r, 0));
minimize(ans, 1 + dp(l, k - 1, 0) + dp(k + 1, r, 1));
}
else {
minimize(ans, 1 + dp(l, k - 1, 0) + dp(k + 1, r, 0));
}
}
// Trường hợp chọn ra cặp (c[l], c[k]) để bổ sung vào xâu đối xứng đang duy trì trước đó nếu có,
// nếu không thì tạo mới một xâu đối xứng
for (int k = l + 1; k <= r; k++) {
if (c[l] == c[k]) {
minimize(ans, (!palin) + dp(l + 1, k - 1, 1) + dp(k + 1, r, 0));
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> c[i];
memset(memo, -1, sizeof memo);
cout << dp(1, n, 0) << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtaW5pbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYiA8IGEpIGEgPSBiOyAKfQoKY29uc3QgaW50IE4gPSA1ZTIgKyA1OyAKCmludCBuOyAKaW50IGNbTl07IAoKLy8gZHAobCwgciwgcGFsaW4pID0gQ2hpIHBow60gw610IG5o4bqldCDEkeG7gyB4b8OhIGjhur90IMSRb+G6oW4gW2wsIHJdIHbDoCB0csaw4bubYyDEkcOzIGPDsyDEkWFuZyBkdXkgdHLDrCB4w6J1IMSR4buRaSB44bupbmcgbsOgbyBoYXkga2jDtG5nCmludCBtZW1vW05dW05dWzJdOyAgCgppbnQgZHAoaW50IGwsIGludCByLCBib29sIHBhbGluKSB7CglpZiAobCA+IHIpIHJldHVybiAwOwoJaWYgKGwgPT0gcikgcmV0dXJuICghcGFsaW4pOyAKCglpbnQmIGFucyA9IG1lbW9bbF1bcl1bcGFsaW5dOyAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7IAoKCWFucyA9IElORjsgICAKCS8vIFRyxrDhu51uZyBo4bujcCB4b8OhIDEga8OtIHThu7EKCWZvciAoaW50IGsgPSBsOyBrIDw9IHI7IGsrKykgewoJCWlmIChwYWxpbikgewoJCQltaW5pbWl6ZShhbnMsIDEgKyBkcChsLCBrIC0gMSwgMSkgKyBkcChrICsgMSwgciwgMCkpOyAKCQkJbWluaW1pemUoYW5zLCAxICsgZHAobCwgayAtIDEsIDApICsgZHAoayArIDEsIHIsIDEpKTsgCgkJfQoJCWVsc2UgewoJCQltaW5pbWl6ZShhbnMsIDEgKyBkcChsLCBrIC0gMSwgMCkgKyBkcChrICsgMSwgciwgMCkpOyAKCQl9Cgl9CgoJLy8gVHLGsOG7nW5nIGjhu6NwIGNo4buNbiByYSBj4bq3cCAoY1tsXSwgY1trXSkgxJHhu4MgYuG7lSBzdW5nIHbDoG8geMOidSDEkeG7kWkgeOG7qW5nIMSRYW5nIGR1eSB0csOsIHRyxrDhu5tjIMSRw7MgbuG6v3UgY8OzLAoJLy8gbuG6v3Uga2jDtG5nIHRow6wgdOG6oW8gbeG7m2kgbeG7mXQgeMOidSDEkeG7kWkgeOG7qW5nCglmb3IgKGludCBrID0gbCArIDE7IGsgPD0gcjsgaysrKSB7CgkJaWYgKGNbbF0gPT0gY1trXSkgewoJCQltaW5pbWl6ZShhbnMsICghcGFsaW4pICsgZHAobCArIDEsIGsgLSAxLCAxKSArIGRwKGsgKyAxLCByLCAwKSk7IAoJCX0KCX0KCglyZXR1cm4gYW5zOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG47IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gY1tpXTsgCgoJbWVtc2V0KG1lbW8sIC0xLCBzaXplb2YgbWVtbyk7IAoJY291dCA8PCBkcCgxLCBuLCAwKSA8PCAnXG4nOyAKfQ==