首页 > 试题广场 >

表达式求值

[编程题]表达式求值
  • 热度指数:25436 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:
1+2*3=7
1*(2+3)=5
1*2*3=6
(1+2)*3=9
现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够获得的最大值。

输入描述:
一行三个数a,b,c (1 <= a, b, c <= 10)


输出描述:
能够获得的最大值
示例1

输入

1 2 3

输出

9

推广到 n 个数

dp[i[[j] 代表 index 从 i 到 j (包含 i 和 j)中的最大值

所以:

dp[i][j] = max(dp[i][k] + dp[k+1][j],dp[i][k] * dp[k+1][j])for i <=k < j

        nums = list(map(int,input().strip().split()))

        dp = [[0]*len(nums) for i in range(len(nums))]

        for i in range(len(dp)-1,-1,-1):
            for j in range(len(dp[0])):
                if i == j:
                    dp[i][j] = nums[i]
                else:
                    for k in range(i,j):
                        dp[i][j] = max([dp[i][k] + dp[k+1][j],dp[i][k] * dp[k+1][j],dp[i][j]])

        # print(dp)
        print(dp[0][len(nums)-1])
编辑于 2019-07-31 17:51:50 回复(7)
#include <iostream>
#include <vector>
 
using namespace std;
 
double max1(double a, double b) {
    return max(a + b, a * b);
}
 
double max2(double a, double b, double c) {
    return max(max1(max1(a, b), c), max1(a, max1(b, c)));
}
 
int main() {
    double a = 0;
    double b = 0;
    double c = 0;
    while (cin >> a >> b >> c) {
        cout << max2(a, b, c) << endl;
    }
    return 0;
}

发表于 2018-08-14 11:18:33 回复(2)
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String[] args){
        Scanner sc = newScanner(System.in);
        inta = sc.nextInt();
        intb = sc.nextInt();
        intc = sc.nextInt();
        int[] d = newint[4];
        d[0] = a + b + c;
        d[1] = (a + b) * c;
        d[2] = a + (b + c);
        d[3] = a * b * c;
        Arrays.sort(d);
        System.out.println(d[3]);
    }
}

发表于 2018-10-11 16:30:13 回复(5)

只需要考虑1的存在就行,其他解法太复杂

a,b,c = map(int, input().split())
if a == 1:
    b += 1
if c == 1:
    b += 1
if b == 1:
    if a < c:
        a += 1
    else:
        c += 1
print(a*b*c)
发表于 2019-09-11 17:09:44 回复(1)
def fun():
    a,b,c = list(map(int, input().split()))
    
    M = max(a+b, a*b)
    if c== 1:
        return M + c
    else:
        return M * c

发表于 2019-08-03 11:08:53 回复(2)
//大致思路,不用考虑括号,最大值一定是由三个数里最大的一个数乘另外两个加或乘的最大值
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int temp_number=0;
    vector <int> vect;
    for(int i=0;i<3;i++)
    {
        cin>>temp_number;
        vect.push_back(temp_number);
    }
    sort(vect.begin(),vect.end());
    cout<<vect[2]*max(vect[0]+vect[1],vect[0]*vect[1])<<endl;
    return 0;
}

发表于 2019-06-29 19:19:23 回复(8)
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static int max1(int a, int b) {
        return Math.max(a + b, a * b);
    }

    public static int max2(int a, int b, int c) {
        return max1(max1(a, b), c);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] num =  new int[3];
        for (int i = 0; i < 3; i++) {
            num[i] = sc.nextInt();
        }
        System.out.println(max2(num[0], num[1], num[2]));
    }
}
发表于 2019-06-30 15:34:49 回复(2)
num_list = list(map(int, input().split()))
num_list.sort()
if num_list[0] <= 1:
    if len(set(num_list)) == 1:  # 判断输入是否为特殊情况1 1 1
        print(3)
    else:
        print((num_list[0] + num_list[1]) * num_list[2])
else:
    print(num_list[0] * num_list[1] * num_list[2])

前面都太复杂,这题只有两种情况:
最小的数小于等于1时,那么最大的结果便是a+b的和再乘以c
若最小数大于1,则最大结果必然是三数的积
编辑于 2019-09-09 13:24:47 回复(6)
绞尽脑汁,得出的完美解答

#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    int calc_res;
    int max = 0;
    calc_res = a + b + c;
    if (max < calc_res)
        max = calc_res;
    calc_res = a + b * c;
    if (max < calc_res)
        max = calc_res;
    calc_res = a * b + c;
    if (max < calc_res)
        max = calc_res;
    calc_res = a * b * c;
    if (max < calc_res)
        max = calc_res;
    calc_res = a * (b + c);
    if (max < calc_res)
        max = calc_res;
    calc_res = (a + b) * c;
    if (max < calc_res)
        max = calc_res;
    cout << max << endl;
    return 0;
}

发表于 2018-10-22 00:09:36 回复(0)
将本题推广到n个数,采用动态规划解法
给出我的一维动态规划代码
dp[i]表示前i 个数中构成最大的数
写出转化方程:
dp[i] = max(nums[i]*dp[i-1], nums[i]+dp[i-1], dp[i-2]*(nums[i]+nums[i-1]))
如有不对的地方,还请多指正!
输入格式: 第一行输入数字的个数n 第二行输入数字数组a1,a2,...,an def solution(nums, n):     dp = [0]*(n)     dp[0], dp[1] = nums[0], max(nums[0]+nums[1], nums[0]*nums[1])     for i in range(2, n):         dp[i] = max(nums[i]*dp[i-1], nums[i]+dp[i-1], dp[i-2]*(nums[i]+nums[i-1]))     return dp[-1] if __name__ == '__main__':     while 1:         n = int(input().strip())         nums = list(map(int, input().strip().split()))         print(solution(nums, n))        

编辑于 2020-06-15 14:11:59 回复(4)

思路:先选出前两个数相加或相乘最大的数,
定义这个较大的数为max,
若第三个数为1,则返回max+1,否则返回max*第三个数。


import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        int max = Math.max(a + b, a * b);
        if (c == 1) {
            System.out.println(max + 1);
        } else {
            System.out.println(max * c);
        }

    }

}
编辑于 2019-07-22 15:44:26 回复(6)
没有人觉得这个题出得有问题吗????
并没有明确表示每个符号只能用一次,也没有说是否要完全部的符号。。。
是我*****吗?
发表于 2019-04-01 20:54:43 回复(8)
只需考虑三个数字里是否含有1就行
#include <iostream>
#include<algorithm>
using namespace std;
int main(){
    int a[3];
    for(int i=0;i<3;i++){
    cin>>a[i];
    }
    sort(a,a+3);
    if(a[0]==1){
    cout<<a[2]*(a[0]+a[1]);
    }
    else{
    cout<<a[2]*a[0]*a[1];
    }
}


发表于 2021-08-25 22:19:20 回复(0)
三个数;为最大的数*(剩余两个数的运算最大值)
import java.util.Arrays;
import java.util.Scanner;

public class 网易_2019_表达式求值 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int[] arr = new int[3];
			for(int i = 0;i < 3;i++) {
				 arr[i] = sc.nextInt();
			}
			Arrays.sort(arr);
			int t1 = arr[0]+arr[1];
			int t2 = arr[0]*arr[1];
			if(t1>t2) {
				System.out.println(t1*arr[2]);
			}else {
				System.out.println(t2*arr[2]);
			}		
		}
	}
}

发表于 2020-08-29 15:34:29 回复(0)
都是正数,就这三种情况,其它的不可能为最大
#include <bits/stdc++.h>
using namespace std;

int a[3];

int main() {
    for(int i=0;i<3;i++) cin >> a[i];
    sort(a, a+3);
    cout << max(max(a[0]*a[1]*a[2], (a[0]+a[1])*a[2]), a[0]+a[1]+a[2]) << endl;
    return 0;
}


发表于 2020-06-11 10:26:08 回复(0)
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] line = br.readLine().split(" ");
        int[] nums = new int[line.length];
        int n = line.length;
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(line[i]);
        }
        long res = 1;
        for (int i = 0; i < n; i++) {
            if (nums[i] == 1) {
                if (i == 0) nums[i + 1]++;
                else if (i == n - 1) nums[i - 1]++;
                else if (nums[i - 1] < nums[i + 1]) nums[i - 1]++;
                else nums[i + 1]++;
            }
        }
        for (int num : nums) res *= num;
        System.out.println(res);
    }
}
java 推广到n个数,出现1就把1加到两边较小的那个数上,最后再累乘一遍即可。
发表于 2020-05-11 14:18:14 回复(0)
#include<iostream>
(720)#include<algorithm>
using namespace std;
int main()
{
    int num;
    int ret=0;
    while(cin>>num)
    {    
        if(0==ret)
            ret=num;
        else
            ret=max(ret*num,num+ret); //遇到1就是相加比较大
    }
    cout<<ret;
}
为什么你们的这么复杂
发表于 2020-04-28 22:58:09 回复(0)
#include<iostream>
(720)#include<algorithm>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
//直接枚举
    int A[6]={0,0,0,0,0,0};
    A[0]=a+b+c;
    A[1]=a+b*c;
    A[2]=a*b+c;
    A[3]=a*b*c;
    A[4]=a*c+b;
    A[5]=(a+b)*c;
//排序后,直接输出最大值
    sort(A,A+6);
    cout<<A[5];
    return 0;
    
}


发表于 2020-04-09 21:51:10 回复(0)
import java.util.Scanner;
import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int[] n=new int[3];
        for(int i=0;i<3;i++){
            n[i]=sc.nextInt();
        }
        Arrays.sort(n);
        int max1=n[0]+n[1]+n[2];//全1的情况
        int max2=(n[0]+n[1])*n[2];//部分有1的情况,例如(1+2)*3
        int max3=n[0]*n[1]*n[2];//无1的情况,例如2*3*4
        System.out.print(Math.max(max1,Math.max(max2,max3)));
    }
}

发表于 2020-02-26 17:03:15 回复(0)
JavaScript(Node) 😎题目:网易-表达式求值(枚举/dp)
//枚举 Math.max() =>over
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    ouput: process.stdout
})
let inArr = []
rl.on('line',line=>{
    if(!line) return
    inArr.push(line.trim())
    if(inArr.length === 1){
        let arr = inArr[0].split(' ').map(e=>+e)
        let a = arr[0],
            b = arr[1],
            c = arr[2]
        let res = Math.max(a+b+c,(a+b)*c,a+b*c,a*b+c,a*b*c,a*(b+c))
        console.log(res)
    }
})   


发表于 2020-02-26 11:31:32 回复(0)