#include <bits/stdc++.h>
using namespace std;
template <class T>
void checkmin(T &t, T x) {
  if (x < t) t = x;
}
template <class T>
void checkmax(T &t, T x) {
  if (x > t) t = x;
}
const int N = 155;
int n;
int w[N];
int F[N][N][N];
char s[N];
void checkmax(int &t, int x, int y) {
  if (x < 0 || y < 0) return;
  if (t < x + y) t = x + y;
}
int dp(int l, int r, int len) {
  if (len < 0 || len > r - l + 1) return -2;
  if (l > r) return len ? -2 : 0;
  if (l == r) {
    if (len == 0) return w[1];
    if (len == 1) return 0;
    return -2;
  } else {
    int &ret = F[l][r][len];
    if (ret != -1) return ret;
    ret = -2;
    if (len) {
      for (int i = l; i <= r; i++) {
        checkmax(ret, dp(l, i, 0), dp(i + 1, r, len));
        checkmax(ret, dp(i, r, 0), dp(l, i - 1, len));
      }
      if (s[l] == s[r]) checkmax(ret, dp(l + 1, r - 1, len - 2), 0);
    } else {
      for (int i = 1; i <= r - l + 1; i++) checkmax(ret, dp(l, r, i), w[i]);
    }
    return ret;
  }
}
int G[N];
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> w[i];
  scanf("%s", s + 1);
  memset(F, 0xFF, sizeof(F));
  memset(G, 0xFF, sizeof(G));
  G[0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < i; j++) checkmax(G[i], G[j], dp(j + 1, i, 0));
    checkmax(G[i], G[i - 1]);
  }
  cout << G[n] << endl;
  return 0;
}
