题目:三个整数分别为a,b,c。属下可以随意运用乘或加这两种运算符号将三个整数连接起来使得运算结果最大。比如:对于1,2,3这三个整数,运算式 (1 + 2)× 3 的运算结果最大,结果为9
三个整数的位置是随意放置的,乘或加随意添加,但两个数字之间只能有一个运算符,可以随意放括号来提升运算优先级。
由于加法和乘法的结合律、交换律,则
a+b+c
a*b*c
不需要加括号或者随意放三个整数
对于加号和乘号都存在的情况:
a*b+c (=b*a+c 根据交换律二者相同,同理下面得出无重的情况)
a*c+b
b*c+a
三种无重情况
有加号和乘号,提高加号优先级的情况有
a*(b+c)
b*(a+c)
c*(a+b)
同理,根据交换律,上面三式无重。
综上共8种情况,需要对这些情况枚举一遍并用数组存储各自的结果。
然后在结果数组中找最大值,可以用快速排序实现高速找最大值。
本题不可以考虑dp,由于-1 0 -1 通过dp得到结果为0,正确结果该为(-1*-1)+0=1
#include<bits/stdc++.h>
using namespace std;
int f[9];
int main(){
int a,b,c;
int n;
cin>>n;
while(n--)
{cin>>a>>b>>c;
f[0]=a+b+c;
f[1]=a*b*c;
f[2]=a*b+c;
f[3]=a*c+b;
f[4]=b*c+a;
f[5]=a*(b+c);
f[6]=b*(a+c);
f[7]=c*(a+b);
sort(f,f+8);
cout<<f[7]<<endl;
}
return 0;
}