#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 155;
struct Info {
  int val;
  bool done;
} best[N_MAX][N_MAX], full[N_MAX][N_MAX], T[N_MAX][N_MAX][N_MAX];
int cost[N_MAX];
char str[N_MAX];
int n;
int calc_T(int, int, int);
int calc_full(int, int);
int calc_best(int, int);
int calc_full(int l, int r) {
  assert(r >= l);
  if (full[l][r].done) return full[l][r].val;
  full[l][r].done = true;
  int &ret = full[l][r].val = -1;
  for (int len = 1; len <= r - l + 1; len++)
    if (cost[len] >= 0 && calc_T(l, r, len) >= 0)
      ret = max(ret, cost[len] + calc_T(l, r, len));
  return ret;
}
int calc_best(int l, int r) {
  assert(r >= l);
  if (best[l][r].done) return best[l][r].val;
  best[l][r].done = true;
  int &ret = best[l][r].val = 0;
  if (calc_full(l, r) >= 0) ret = max(ret, calc_full(l, r));
  for (int t = l; t < r; t++)
    ret = max(ret, calc_best(l, t) + calc_best(t + 1, r));
  return ret;
}
int calc_T(int l, int r, int len) {
  if (len > r - l + 1) return -1;
  if (T[l][r][len].done) return T[l][r][len].val;
  T[l][r][len].done = true;
  int &ret = T[l][r][len].val = -1;
  if (len == r - l + 1) {
    ret = 0;
    for (int t = 0; t < len; t++)
      if (str[l + t] != str[l + len - t - 1]) ret = -1;
    return ret;
  }
  if (len == 0) {
    if (l == r + 1)
      ret = 0;
    else if (l <= r)
      ret = calc_full(l, r);
  } else {
    if (len == 1) {
      for (int t = l; t <= r; t++) {
        int tmp = 0;
        if (t > l) {
          if (calc_full(l, t - 1) == -1) continue;
          tmp += calc_full(l, t - 1);
        }
        if (t < r) {
          if (calc_full(t + 1, r) == -1) continue;
          tmp += calc_full(t + 1, r);
        }
        ret = max(ret, tmp);
      }
    } else {
      for (int t = l; t < r; t++)
        if (calc_full(l, t) >= 0 && calc_T(t + 1, r, len) >= 0)
          ret = max(ret, calc_full(l, t) + calc_T(t + 1, r, len));
      for (int t = r; t > l; t--)
        if (calc_full(t, r) >= 0 && calc_T(l, t - 1, len) >= 0)
          ret = max(ret, calc_full(t, r) + calc_T(l, t - 1, len));
      if (str[l] == str[r] && calc_T(l + 1, r - 1, len - 2) >= 0)
        ret = max(ret, calc_T(l + 1, r - 1, len - 2));
    }
  }
  return ret;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &cost[i]);
  scanf("%s", str + 1);
  printf("%d\n", calc_best(1, n));
}
