2019校招真题编程(十三)表达式求值

92 篇文章 0 订阅

题目描述

今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:
1+23=7
1
(2+3)=5
123=6
(1+2)*3=9

现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", “*”, “(”, ")"符号,能够获得的最大值。

一行三个数a,b,c (1 <= a, b, c <= 10)
能够获得的最大值

我的思路

对3个数排序(从大到小),判断后两个和第一个的关系

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int>record(3,0);
    int ans=0;
    for(int i=0; i<3; i++)
    {
        cin>>record[i];
    }
    sort(record.begin(), record.end());
    if(record[2] == 1) ans = record[0]+record[1]+record[2];
    else ans = record[2] * max(record[0]+record[1], record[0]*record[1]);
    
    cout<<ans<<endl;
}

运行时间:5ms

占用内存:404k

其他解题方法

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

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

链接:https://www.nowcoder.com/questionTerminal/3e483fe3c0bb447bb17ffb3eeeca78ba
来源:牛客网

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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值