#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;   }