#include <bits/stdc++.h>
using namespace std;
const int kMaxL = 155;
const int kInf = 1E8;
string str;
int cost[kMaxL];
int memo_f[kMaxL][kMaxL], memo_g[kMaxL][kMaxL];
int memo_p[kMaxL][kMaxL][kMaxL];
bool mark_f[kMaxL][kMaxL], mark_g[kMaxL][kMaxL];
bool mark_p[kMaxL][kMaxL][kMaxL];
int g(int, int);
int p(int i, int j, int last) {
  if (!last) return g(i, j);
  if (i > j) return !last ? 0 : -kInf;
  if (last > j - i + 1) return -kInf;
  int &ref = memo_p[i][j][last];
  if (!mark_p[i][j][last]) {
    mark_p[i][j][last] = true;
    ref = -kInf;
    if (last == 1) {
      for (int k = i; k <= j; ++k) ref = max(ref, g(i, k - 1) + g(k + 1, j));
    } else {
      for (int k = i + 1; k <= j; ++k) {
        if (str[i] == str[k])
          ref = max(ref, p(i + 1, k - 1, last - 2) + g(k + 1, j));
        ref = max(ref, g(i, k - 1) + p(k, j, last));
      }
    }
  }
  return ref;
}
int g(int i, int j) {
  if (i > j) return 0;
  int &ref = memo_g[i][j];
  if (!mark_g[i][j]) {
    mark_g[i][j] = true;
    ref = -kInf;
    for (int last = 1; last <= j - i + 1; ++last)
      if (cost[last] != -1) {
        int join = p(i, j, last);
        ref = max(ref, join + cost[last]);
      }
  }
  return ref;
}
int f(int i, int j) {
  if (i > j) return 0;
  int &ref = memo_f[i][j];
  if (!mark_f[i][j]) {
    mark_f[i][j] = true;
    for (int k = i; k <= j; ++k) ref = max(ref, f(i, k - 1) + f(k + 1, j));
    ref = max(ref, g(i, j));
  }
  return ref;
}
int main() {
  int L;
  cin >> L;
  for (int i = 1; i <= L; ++i) cin >> cost[i];
  cin >> str;
  cout << f(0, str.size() - 1) << endl;
  return 0;
}
