#include <bits/stdc++.h>
using namespace std;
int memo[155][155], C[155];
bool palin[155][155];
char s[155];
int solve(int p1, int p2) {
  if (p1 > p2) return 0;
  if (p1 == p2) {
    if (C[1] == -1) return -(1 << 29);
    return C[1];
  }
  int &ret = memo[p1][p2];
  if (ret != -1) return ret;
  int ans = -(1 << 29);
  if (palin[p1][p2] && C[p2 - p1 + 1] != -1) ans = C[p2 - p1 + 1];
  for (int i = p1; i < p2; i++) ans = max(ans, solve(p1, i) + solve(i + 1, p2));
  if (C[1] != -1) ans = max(ans, C[1] + solve(p1 + 1, p2));
  if (C[1] != -1) ans = max(ans, C[1] + solve(p1, p2 - 1));
  int _p1 = p1, _p2 = p2, len;
  while (_p1 <= _p2 && s[_p1] == s[_p2]) {
    len = _p1 - p1 + 1;
    len += p2 - _p2 + 1;
    if (C[len] != -1) ans = max(ans, C[len] + solve(_p1 + 1, _p2 - 1));
    if (C[len + 1] != -1 && p2 - p1 + 1 >= len + 1) {
      ans = max(ans, C[len + 1] + solve(_p1 + 2, _p2 - 1));
      ans = max(ans, C[len + 1] + solve(_p1 + 1, _p2 - 2));
    }
    _p1++;
    _p2--;
  }
  for (int i = _p1; i <= _p2; i++) {
    len = i - p1 + 1 + p2 - _p2;
    if (C[len] != -1 && palin[_p1][i])
      ans = max(ans, C[len] + solve(i + 1, _p2));
  }
  for (int i = _p2; i >= _p1; i--) {
    len = p2 - i + 1 + _p1 - p1;
    if (C[len] != -1 && palin[i][_p2])
      ans = max(ans, C[len] + solve(_p1, i - 1));
  }
  return ret = ans;
}
int M[155], n;
int f(int l, int r, int lon);
int dp1[155][155], dp2[155][155][155];
int comple(int l, int r) {
  if (r < l) return 0;
  int ans = -(1 << 29);
  if (dp1[l][r] != -1) return dp1[l][r];
  for (int i = 1; i <= n; ++i) {
    if (r - l + 1 >= i && C[i] >= 0) ans = max(ans, C[i] + f(l, r, i));
  }
  return dp1[l][r] = ans;
}
int f(int l, int r, int lon) {
  if (r - l + 1 < lon) return -(1 << 29);
  if (lon == 0) return comple(l, r);
  int ans = -(1 << 29);
  if (dp2[l][r][lon] != -1) return dp2[l][r][lon];
  if (lon == 1) {
    for (int i = l; i <= r; ++i) {
      ans = max(ans, comple(l, i - 1) + comple(i + 1, r));
    }
  } else {
    for (int i = l; i < r; ++i) {
      ans = max(ans, comple(l, i) + f(i + 1, r, lon));
      ans = max(ans, comple(i + 1, r) + f(l, i, lon));
    }
    if (s[l] == s[r]) ans = max(ans, f(l + 1, r - 1, lon - 2));
  }
  return dp2[l][r][lon] = ans;
}
int DP(int pos) {
  if (pos >= n) return 0;
  int &ret = M[pos];
  if (ret != -1) return ret;
  int ans = DP(pos + 1);
  for (int i = pos; i < n; i++) ans = max(ans, comple(pos, i) + DP(i + 1));
  return ret = ans;
}
int main() {
  while (cin >> n) {
    for (int i = 1; i <= n; i++) scanf("%d", &C[i]);
    scanf("%s", s);
    int n = strlen(s);
    for (int i = 0; i < n; i++) {
      int p1 = i, p2 = i + 1;
      while (p1 >= 0 && p2 < n && s[p1] == s[p2]) {
        palin[p1][p2] = true;
        p1--, p2++;
      }
    }
    for (int i = 0; i < n; i++) {
      int p1 = i, p2 = i;
      while (p1 >= 0 && p2 < n && s[p1] == s[p2]) {
        palin[p1][p2] = true;
        p1--, p2++;
      }
    }
    memset(memo, -1, sizeof memo);
    memset(M, -1, sizeof M);
    memset(dp1, -1, sizeof dp1);
    memset(dp2, -1, sizeof dp2);
    int ans = DP(0);
    printf("%d\n", ans);
  }
}
