CodeForces - 552E Vanya and Brackets

Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u

Description

Vanya is doing his maths homework. He has an expression of form , where x1, x2, ..., xn are digits from 1 to 9, and sign represents either a plus '+' or the multiplication sign '*'. Vanya needs to add one pair of brackets in this expression so that to maximize the value of the resulting expression.

Input

The first line contains expression s (1 ≤ |s| ≤ 5001, |s| is odd), its odd positions only contain digits from 1 to 9, and even positions only contain signs  +  and  * .

The number of signs  *  doesn't exceed 15.

Output

In the first line print the maximum possible value of an expression.

Sample Input

Input
3+5*7+8*4
Output
303
Input
2+3*5
Output
25
Input
3*4*5
Output
60

Hint

Note to the first sample test. 3 + 5 * (7 + 8) * 4 = 303.

Note to the second sample test. (2 + 3) * 5 = 25.

Note to the third sample test. (3 * 4) * 5 = 60 (also many other variants are valid, for instance, (3) * 4 * 5 = 60).

Source

 
解题:暴力瞎搞,注意int溢出,傻逼逼的把栈写成int了。。。哎吸取教训
 
CodeForces - 552E Vanya and Brackets
 1 #include <bits/stdc++.h>

 2 using namespace std;

 3 typedef long long LL;

 4 vector<int>pos;

 5 stack<LL>num;

 6 stack<char>op;

 7 LL calc(const string &str) {

 8     while(!num.empty()) num.pop();

 9     while(!op.empty()) op.pop();

10     for(int i = 0,slen = str.length(); i < slen; ++i) {

11         if(str[i] == ')') {

12             while(op.top() != '(') {

13                 LL tmp = num.top();

14                 num.pop();

15                 if(op.top() == '*') num.top() *= tmp;

16                 else if(op.top() == '+') num.top() += tmp;

17                 op.pop();

18             }

19             op.pop();

20             continue;

21         }

22         if(isdigit(str[i])) num.push(str[i] - '0');

23         else if(str[i] == '+' && !op.empty() && op.top() == '*') {

24             while(!op.empty() && op.top() == '*') {

25                 LL tmp = num.top();

26                 num.pop();

27                 num.top() *= tmp;

28                 op.pop();

29             }

30             op.push(str[i]);

31         } else op.push(str[i]);

32     }

33     while(!op.empty()) {

34         LL tmp = num.top();

35         num.pop();

36         if(op.top() == '*') num.top() *= tmp;

37         else if(op.top() == '+') num.top() += tmp;

38         op.pop();

39     }

40     return num.top();

41 }

42 int main() {

43     string str;

44     cin>>str;

45     pos.push_back(-1);

46     int slen = str.length();

47     for(int i = 1; i < slen; i += 2)

48         if(str[i] == '*') pos.push_back(i);

49     pos.push_back(slen);

50     slen = pos.size();

51     LL ret = INT_MIN;

52     for(int i = 0; i+1 < slen; ++i)

53         for(int j = i+1; j < slen; ++j) {

54             string s = str;

55             s.insert(pos[i]+1,1,'(');

56             s.insert(pos[j]+1,1,')');

57             ret = max(ret,calc(s));

58         }

59     cout<<ret<<endl;

60     return 0;

61 }
View Code

 

你可能感兴趣的:(codeforces)