题目描述
今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:
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])