#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <utility>
#include <map>
#include <set>
#include <functional>
#include <math.h>
#include <time.h>
#include <fstream>
#include <list>
#include <climits>
#include <iomanip>
using namespace std;
typedef long long int lld;
typedef long double ld;
typedef vector<int> vi;
typedef vector<char> vch;
typedef vector<lld> vlld;
typedef vector<vi> vivi;
typedef vector<vlld> vlvl;
lld cal(lld a, lld b, char op) //계산함수
{
lld res;
switch (op)
{
case '+':
{
res = a + b;
break;
}
case '-':
{
res = a - b;
break;
}
case '*':
{
res = a * b;
break;
}
}
return res;
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int n;
lld mx, tmp, no = -99999999999999; //mx: 최종 답, no: 초기값
string str;
cin >> n >> str;
int sz = n / 2 + 1; //피연산자 갯수
vlld operand; //피연산자가 순서대로 들어갈 곳
vlvl dp(sz + 1, vlld(4, no)); //4 X (sz + 1)
vch opertor; //연산자가 순서대로 들어갈 곳
for (int i = 0; i < n; ++i)
{
if (i % 2)
opertor.push_back(str[i]); //연산자 push
else
operand.push_back(str[i] - '0'); //피연산자 push
}
dp[1][0] = operand[0]; //초기화(양수 최댓값)
dp[1][2] = operand[0]; //초기화(양수 최솟값)
if (sz > 1) //피연산자가 2개 이상이라면
{
tmp = cal(operand[0], operand[1], opertor[0]); //첫 번째 연산자와 두 번째 연산자 계산
if (tmp >= 0) //양수
{
dp[2][0] = tmp; //양수 최댓값
dp[2][2] = tmp; //양수 최솟값
}
else //음수
{
dp[2][1] = tmp; //음수 최솟값
dp[2][3] = tmp; //음수 최댓값
}
}
for (int i = 3; i <= sz; ++i)
{
for (int j = 0; j < 4; ++j) //저장한 모든 최댓값, 최솟값에 대하여
{
if (dp[i - 1][j] == no) //이전 식 계산으로 도달한 값이 없으면
continue; //pass (ex, 테케 1+5인 경우 음수 최댓값/최솟값에는 초기값이 들어있음)
tmp = cal(dp[i - 1][j], operand[i - 1], opertor[i - 2]); // dp[k - 1]와 1개의 추가 피연산자 계산 ex(1+5*3에서 (1+5) * 3)
if (tmp >= 0) //양수
{
dp[i][0] = max(dp[i][0], tmp); //양수 최댓값 갱신
dp[i][2] = min(dp[i][2], tmp); //음수 최댓값 갱신
}
else
{
if (dp[i][1] == no) //초기값?
dp[i][1] = tmp; //갱신
else
dp[i][1] = -max(abs(dp[i][1]), abs(tmp)); //음수 최댓값 갱신
if (dp[i][3] == no) //초기값?
dp[i][3] = tmp; //갱신
else
dp[i][3] = -min(abs(dp[i][3]), abs(tmp)); //음수 최솟값 갱신
}
}
for (int j = 0; j < 4; ++j) //저장한 모든 최댓값, 최솟값에 대하여
{
if (dp[i - 2][j] == no) //이전 식 계산으로 도달한 값이 없으면
continue; //pass (ex, 테케 1+5인 경우 음수 최댓값/최솟값에는 초기값이 들어있음)
tmp = cal(dp[i - 2][j], cal(operand[i - 2], operand[i - 1], opertor[i - 2]), opertor[i - 3]);// dp[k - 2]와 2개의 추가 피연산자 계산(ex 1+5*3에서 1+(5*3))
if (tmp >= 0) //양수
{
dp[i][0] = max(dp[i][0], tmp); //양수 최댓값 갱신
dp[i][2] = min(dp[i][2], tmp); //음수 최댓값 갱신
}
else
{
if (dp[i][1] == no) //초기값?
dp[i][1] = tmp; //갱신
else
dp[i][1] = -max(abs(dp[i][1]), abs(tmp)); //음수 최댓값 갱신
if (dp[i][3] == no) //초기값?
dp[i][3] = tmp; //갱신
else
dp[i][3] = -min(abs(dp[i][3]), abs(tmp)); //음수 최솟값 갱신
}
}
}
for (int i = 0; i < 4; ++i)
mx = max(mx, dp[sz][i]); // 저장한 4개의 값 중 최댓값 산출
cout << mx << '\n';
return 0;
}