import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PolygonGame polygon = new PolygonGame();
System.out.println(polygon.polyMax());
}
}
class PolygonGame
{
static int n; //顶点个数
static String[] op; //操作符数组
static int[] v; //顶点代表的数
static int minf, maxf; //在某处断开的最小,最大值
static int m[][][]; //链p[i][j]合并的最大最小值
public PolygonGame()
{
Scanner in = new Scanner(System.in);
n = in.nextInt(); //输入顶点个数
in.nextLine();
String str = in.nextLine(); //顶点代表的数和操作符输入
String[] s = str.split(" ");//空格分开的字符串数组
op = new String[n+1]; //分配空间
v = new int[n+1];
for(int i=0, k=n, j=n; i<s.length; i++) {
if(i%2==0) {
v[k] = Integer.parseInt(s[i]); //顶点代表的数
k--;
} else {
op[j] = s[i]; //操作符
j--;
}
}
m = new int[n+1][n+1][2];
for(int i = 1;i<=n;i++)
{//初始边界
m[i][1][0] = v[i];
m[i][1][1] = v[i];
}
}
private static void minMax(int i,int s,int j)
{
int []e = new int[5];
int a = m[i][s][0], //某段的最小最大值
b = m[i][s][1],
r = (i+s-1)%n+1,
c = m[r][j-s][0],
d = m[r][j-s][1];
if(op[r].equals("+"))
{
minf = a+c;//最小值为两段最小值之和
maxf = b+d;//最大值为两段最大值之和
}
else
{
e[1] = a*c;
e[2] = a*d;
e[3] = b*c;
e[4] = b*d;
minf = e[1];
maxf = e[1];
for(int k = 2;k<5;k++)
{
if(minf >e[k])
minf = e[k];
if(maxf < e[k])
maxf = e[k];
}
}
}
public static int polyMax()
{
for(int j = 2;j<=n;j++)
for(int i = 1;i<=n;i++)
for(int s = 1;s<j;s++)
{
minMax(i,s,j);
if(m[i][j][0] > minf)
m[i][j][0] = minf;
if(m[i][j][1] < maxf)
m[i][j][1] = maxf;
}
int temp = m[1][n][1];
for(int i= 2;i<=n;i++)
if(temp < m[i][n][1])
temp = m[i][n][1];
return temp;
}
}