加括号

有一个算术表达式 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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值