← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var l int
	if _, err := fmt.Fscan(reader, &l); err != nil {
		return
	}

	a := make([]int, l+1)
	for i := 1; i <= l; i++ {
		fmt.Fscan(reader, &a[i])
	}

	var s string
	fmt.Fscan(reader, &s)
	s = " " + s // 1-based indexing

	const INF = int(1e9)

	dp := make([][][]int, l+2)
	for i := range dp {
		dp[i] = make([][]int, l+2)
		for j := range dp[i] {
			dp[i][j] = make([]int, l+2)
			for k := range dp[i][j] {
				dp[i][j][k] = -INF
			}
		}
	}

	E := make([][]int, l+2)
	for i := range E {
		E[i] = make([]int, l+2)
		for j := range E[i] {
			E[i][j] = -INF
		}
	}

	for i := 1; i <= l+1; i++ {
		E[i][i-1] = 0 
	}

	for i := 1; i <= l; i++ {
		dp[i][i][1] = 0
		if a[1] != -1 {
			E[i][i] = a[1]
		}
	}

	for length := 2; length <= l; length++ {
		for i := 1; i <= l-length+1; i++ {
			j := i + length - 1

			for k := 1; k <= length; k++ {
				res := -INF
				
				// Option 1: Strip a completely deleted prefix
				for m := i; m < j; m++ {
					v1 := E[i][m]
					if v1 != -INF {
						v2 := dp[m+1][j][k]
						if v2 != -INF {
							if v1+v2 > res {
								res = v1 + v2
							}
						}
					}
				}

				// Option 2: Strip a completely deleted suffix
				for m := i + 1; m <= j; m++ {
					v1 := dp[i][m-1][k]
					if v1 != -INF {
						v2 := E[m][j]
						if v2 != -INF {
							if v1+v2 > res {
								res = v1 + v2
							}
						}
					}
				}

				// Option 3: Match the outward characters of the palindrome
				if s[i] == s[j] {
					if k == 2 {
						v := E[i+1][j-1]
						if v != -INF {
							if v > res {
								res = v
							}
						}
					} else if k > 2 {
						v := dp[i+1][j-1][k-2]
						if v != -INF {
							if v > res {
								res = v
							}
						}
					}
				}

				dp[i][j][k] = res
			}

			resE := -INF
			// Completely delete the current substring by reducing it to a single palindrome
			for k := 1; k <= length; k++ {
				if dp[i][j][k] != -INF && a[k] != -1 {
					if dp[i][j][k]+a[k] > resE {
						resE = dp[i][j][k] + a[k]
					}
				}
			}

			// Completely delete the current substring by splitting into two adjacent completely deleted blocks
			for m := i; m < j; m++ {
				v1 := E[i][m]
				if v1 != -INF {
					v2 := E[m+1][j]
					if v2 != -INF {
						if v1+v2 > resE {
							resE = v1 + v2
						}
					}
				}
			}

			E[i][j] = resE
		}
	}

	F := make([]int, l+1)
	F[0] = 0
	for i := 1; i <= l; i++ {
		F[i] = F[i-1] 
		for j := 1; j <= i; j++ {
			if E[j][i] != -INF {
				if F[j-1]+E[j][i] > F[i] {
					F[i] = F[j-1] + E[j][i]
				}
			}
		}
	}

	fmt.Println(F[l])
}