#include <bits/stdc++.h>
using namespace std;
char BUFFER[100000 + 5];
bool readn(int &n) { return scanf("%d", &n) == 1; }
bool readl(long long &n) { return scanf("%I64d", &n) == 1; }
bool readd(double &n) { return scanf("%lf", &n) == 1; }
bool reads(string &s) {
  s = "";
  int n = scanf("%s", BUFFER);
  if (n == 1) s = BUFFER;
  return n == 1;
}
bool readln(string &s) {
  char *valid = gets(BUFFER);
  if (valid) s = BUFFER;
  return ((bool)valid);
}
void Print(long long &n, bool printNewLine = true) {
  printNewLine ? printf("%I64d\n", n) : printf("%I64d", n);
}
const int maxn = 150 + 5;
int dp[maxn][maxn][maxn], palindrome[maxn][maxn], A[maxn][maxn];
string s;
vector<int> v;
int isPalindrome(int i, int j) {
  if (i > j) return 1;
  int &res = palindrome[i][j];
  if (res != -1) return res;
  if (i == j) return res = 1;
  if (s[i] != s[j]) return res = 0;
  return res = isPalindrome(i + 1, j - 1);
}
int memo(int i, int j, int k) {
  int L = j - i + 1, val = -1e8, d, p;
  if (L < k || k < 0) return -1e8;
  if (i > j) return 0;
  int &res = dp[i][j][k];
  if (res != -1) return res;
  if (L == 0) return res = 0;
  if (L == 1) return res = (k == 0 ? v[L] : 0);
  if (k == 0) {
    if (isPalindrome(i, j)) val = max(val, v[L]);
    if (s[i] == s[j])
      for (p = 0; p < L - 2 + 1; ++p) {
        val = max(val, memo(i + 1, j - 1, p) + v[p + 2]);
      }
    for (p = i; p < j; ++p) {
      val = max(val, memo(i, p, 0) + memo(p + 1, j, 0));
    }
  }
  if (k <= 1) {
    d = (k == 0) ? v[1] : 0;
    for (p = i; p < j + 1; ++p) {
      val = max(val, memo(i, p - 1, 0) + memo(p + 1, j, 0) + d);
    }
    return res = val < 0 ? -1e8 : val;
  }
  if (s[i] == s[j]) val = max(val, memo(i + 1, j - 1, k - 2));
  for (p = i; p < j; ++p) {
    val = max(val, memo(i, p, k) + memo(p + 1, j, 0));
    val = max(val, memo(i, p, 0) + memo(p + 1, j, k));
  }
  return res = val < 0 ? -1e8 : val;
}
int answer(int i, int j) {
  int p, &res = A[i][j];
  if (res != -1) return res;
  if (i == j) return res = max(0, v[1]);
  res = max(0, memo(i, j, 0));
  for (p = i; p < j; ++p) {
    res = max(res, answer(i, p) + answer(p + 1, j));
  }
  return res;
}
int calc() {
  memset((dp), (-1), sizeof(dp));
  memset((A), (-1), sizeof(A));
  memset((palindrome), (-1), sizeof(palindrome));
  int i, n;
  cin >> n;
  v.resize(n + 1);
  v[0] = 0;
  for (i = 1; i < ((int)v.size()); ++i) {
    cin >> v[i];
    if (v[i] < 0) v[i] = -1e8;
  }
  cin >> s;
  return answer(0, n - 1);
}
int main() {
  cout << calc() << endl;
  return 0;
}
