#include <bits/stdc++.h>
using namespace std;
const int MAX = 173, MAX2 = 400;
const int foo = INT_MIN;
char s[MAX];
int slen, l, an[MAX];
int B[MAX][MAX], F[MAX][MAX], R[MAX][MAX][MAX];
bool hh[MAX][MAX];
inline bool good(int i, int j) { return i <= j; }
int full(int i, int j);
int best(int i, int j) {
  auto &ele = B[i][j];
  if (ele != -1)
    return ele;
  else {
    if (i == j) {
      if (an[1] != -1)
        return ele = an[1];
      else
        return ele = 0;
    } else {
      ele = full(i, j);
      for (int r = (i); r <= (j); ++r) {
        ele = max(ele, (good(i, r - 1) ? best(i, r - 1) : 0) +
                           (good(r + 1, j) ? best(r + 1, j) : 0));
      }
      return ele;
    }
  }
}
int resi(int i, int j, int re);
int full(int i, int j) {
  auto &ele = F[i][j];
  if (ele != -1)
    return ele;
  else {
    if (i == j) {
      if (an[1] == -1)
        return ele = foo;
      else
        return ele = an[1];
    } else {
      int len = j - i + 1;
      ele = foo;
      for (int re = (1); re <= (len); ++re) {
        if (resi(i, j, re) != foo && an[re] != -1) {
          ele = max(resi(i, j, re) + an[re], ele);
        }
      }
      return ele;
    }
  }
}
int resi(int i, int j, int re) {
  auto &ele = R[i][j][re];
  if (ele != -1)
    return ele;
  else {
    if (i == j) {
      return ele = 0;
    } else {
      int len = j - i + 1;
      if (len == re) {
        if (hh[i][j])
          return ele = 0;
        else
          return ele = foo;
      } else {
        if (re == 1) {
          ele = foo;
          for (int pos = (i); pos <= (j); ++pos) {
            int l = pos == i ? 0 : full(i, pos - 1);
            if (l != foo) {
              int r = pos == j ? 0 : full(pos + 1, j);
              if (r != foo) {
                ele = max(ele, l + r);
              }
            }
          }
          return ele;
        } else {
          ele = foo;
          for (int bl = (i + 1); bl <= (j + 1 - re); ++bl) {
            int tmp = full(i, bl - 1);
            if (tmp != foo) {
              int tmp2 = resi(bl, j, re);
              if (tmp2 != foo) {
                ele = max(ele, tmp + tmp2);
              }
            }
          }
          for (int bl = (j - 1); bl >= (re + i - 1); --bl) {
            int tmp = full(bl + 1, j);
            if (tmp != foo) {
              int tmp2 = resi(i, bl, re);
              if (tmp2 != foo) {
                ele = max(ele, tmp + tmp2);
              }
            }
          }
          if (s[i] == s[j])
            ele = max(ele, re - 2 == 0 ? full(i + 1, j - 1)
                                       : resi(i + 1, j - 1, re - 2));
          return ele;
        }
      }
    }
  }
}
int main() {
  scanf("%d", &l);
  for (int i = (1); i <= (l); ++i) scanf("%d", &an[i]);
  scanf("%s", s);
  slen = strlen(s);
  memset(B, -1, sizeof(B)), memset(F, -1, sizeof(F)), memset(R, -1, sizeof(R));
  for (int i = (0); i <= (slen - 1); ++i) {
    for (int j = (i); j <= (slen - 1); ++j) {
      if (i == j)
        hh[i][j] = 1;
      else {
        int mid = (i + j) / 2;
        hh[i][j] = 1;
        for (int k = (i); k <= (mid); ++k) {
          int rk = j - k + i;
          if (s[k] != s[rk]) {
            hh[i][j] = 0;
            break;
          }
        }
      }
    }
  }
  printf("%d\n", best(0, slen - 1));
  return 0;
}
