有一个算术表达式 x1 Δ x2 Δ x3 Δ ,..., Δ xn, x1,x2,x3,...,xn 是1到 9的数字, Δ是'+'或者'*'。
现在要求你在这个表达式中加一对括号,使得这个式子的值最大。
样例解释:3 + 5 * (7 + 8) * 4 = 303。
Input
单组测试数据。 第一给出表达式s(1 ≤ |s| ≤ 5001, |s| 是奇数),它的奇数位是1到9的数字字符,偶数位是'+'或'*'。 '*'的数目不超过15。
Output
输出最大的值。
Input示例
3+5*7+8*4
Output示例
303
#include <iostream>
#include <cstring>
#include <map>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long int ll;
const int MAXN = 5000 + 5;
char input[MAXN];
int main()
{
map<int, ll> sums;
cin >> input;
int len = strlen(input);
ll temp = 0;
ll sum = 0;
int i = 0;
vector<int> multies;
multies.push_back(-1);
while (i < len)
{
if (input[i] == '+')
{
sum += temp;
sums[i] = sum;
i += 1;
}
else if (input[i] == '*')
{
int right = i;
while (input[right] == '*')
{
multies.push_back(right);
right += 2;
}
for (int j = i + 1; j < right; j += 2)
{
temp *= (input[j] - '0');
}
i = right;
}
else
{
temp = input[i] - '0';
i += 1;
}
}
multies.push_back(len);
sums[len] = sum + temp;
ll result = sums[len];
i = 0;
int left = 0;
int right = 0;
int k = 0;
int size = multies.size();
for (i = 0; i < size - 1; i++)
{
for (int j = i + 1; j < size; j++)
{
left = multies[i];
right = multies[j];
while (left < multies[j] && (input[left] == '*' || left == -1))
{
left += 2;
}
while (right > multies[i] && (input[right] == '*' || right == len))
{
right -= 2;
}
if (left > right)
{
continue;
}
else
{
sum = 1;
for (k = multies[i] + 1; k < left; k += 2)
{
sum *= (input[k] - '0');
}
ll rightSum = 1;
for (k = multies[j] - 1; k > right; k -= 2)
{
rightSum *= (input[k] - '0');
}
sum += rightSum;
sum += (sums[right] - sums[left]);
int m, n;
for (m = multies[i]; m > 0 && input[m] == '*'; m -= 2)
{
sum *= (input[m - 1] - '0');
}
for (n = multies[j]; n < len && input[n] == '*'; n += 2)
{
sum *= (input[n + 1] - '0');
}
if (m > 0)
{
sum += sums[m];
}
if (n < len)
{
sum += (sums[len] - sums[n]);
}
result = max(result, sum);
}
}
}
cout << result << endl;
return 0;
}