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.
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.
In the first line print the maximum possible value of an expression.
3+5*7+8*4
303
2+3*5
25
3*4*5
60
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).
给你一个表达式,只有乘号和加号,数字都是1到9,要求加一个括号,使得表达式的值最大,问最大是多少。乘号个数<=15。
左括号一定在乘号右边,右括号一定在乘号左边,因为如果不是这样的话,一定可以调整括号的位置使表达式的值增大。这个应该不难想。
于是只要枚举括号的位置然后计算表达式即可。
转载请注明出处:寻找&星空の孩子
题目链接:http://codeforces.com/contest/552/problem/E
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int N = 5005;
#define LL __int64
char fh[N],s[N];
LL num[N];
int ftop,ntop ,slen;
void calculate(){
if(fh[ftop]=='+')
num[ntop-1]+=num[ntop],ntop--;
else if(fh[ftop]=='-')
num[ntop-1]-=num[ntop],ntop--;
else if(fh[ftop]=='*')
num[ntop-1]*=num[ntop],ntop--;
else if(fh[ftop]=='/')
num[ntop-1]/=num[ntop],ntop--;
ftop--;
}
void countfuction(int l,int r){
ftop=0;ntop=0;
int flagNum=0;
LL ans=0;
for(int i=0; i<=slen; ++i){
if(i!=slen&&(s[i]>='0'&&s[i]<='9')){
ans=ans*10+s[i]-'0';
flagNum=1;
}
else{
if(flagNum)num[++ntop]=ans; flagNum=0; ans=0;
if(i==slen)break;
if(s[i]=='+'||s[i]=='-'){
while(ftop&&fh[ftop]!='(') calculate();
fh[++ftop]=s[i];
}
else if(s[i]=='*'&&i==r){
while(ftop&&fh[ftop]!='(') calculate(); ftop--;
while(ftop&&(fh[ftop]=='*'||fh[ftop]=='/')) calculate();
fh[++ftop]=s[i];//printf("# ");
}
else if(s[i]=='*'||i==l){
while(ftop&&(fh[ftop]=='*'||fh[ftop]=='/')) calculate();
fh[++ftop]=s[i];
if(i==l)
fh[++ftop]='(';
}
}
}
while(ftop) calculate();
}
int main(){
while(scanf("%s",s)>0){
LL ans=0;
int id[20],k=0;
for(int i=strlen(s); i>=0; i--)
s[i+2]=s[i];
s[0]='1'; s[1]='*';
slen=strlen(s);
s[slen]='*'; s[slen+1]='1'; s[slen+2]='\0';
slen=strlen(s);
for(int i=0; i<slen; i++)
if(s[i]=='*')
id[k++]=i;
for(int i=0; i<k-1; i++)
for(int j=i+1; j<k; j++){
countfuction(id[i],id[j]);
if(num[1]>ans)
ans=num[1];
}
printf("%I64d\n",ans);
}
}
或着
#include <bits/stdc++.h>
using namespace std;
int n;
string str;
vector<int> pos;
stack<char> sc;
stack<long long> sn;
long long twoResult(long long a, long long b, char c) {
return (c == '*') ? a * b : a + b;
}
void cal() {
char t = sc.top();
sc.pop();
long long a = sn.top();
sn.pop();
long long b = sn.top();
sn.pop();
sn.push(twoResult(a, b, t));
}
long long expression(string s) {
for (int i = 0; i < s.length(); i++) {
char c = s[i];
if (isdigit(c)) {
sn.push(c - '0');
} else if (c == '(') {
sc.push(c);
} else if (c == ')') {
while (sc.top() != '(')
cal();
sc.pop();
} else {
if (c == '+') {
while (!sc.empty() && sc.top() == '*')
cal();
sc.push(c);
} else sc.push(c);
}
}
while (!sc.empty()) cal();
return sn.top();
}
int main() {
cin >> str;
n = str.size();
pos.push_back(-1);
for (int i = 1; i < n; i += 2)
if (str[i] == '*') pos.push_back(i);
pos.push_back(n);
int len = pos.size();
long long ans = 0;
for (int i = 0; i < len - 1; i++) { // left
for (int j = i + 1; j < len; j++) { // right
string s = str;
s.insert(pos[i] + 1, 1, '(');
s.insert(pos[j] + 1, 1, ')');
ans = max(ans, expression(s));
}
}
cout << ans << endl;
return 0;
}