2020网易:表达式求值[Python][动态规划]

表达式求值

http://www.nowcoder.com/questionTerminal/3e483fe3c0bb447bb17ffb3eeeca78ba

简单问题,可以进行推广:其一,本题中只有三个数,因此直接枚举;其二,若有n个数,则是个dp问题。

# 3个数直接枚举
from functools import reduce
a, b, c = map(int, input().split())

all_plus = sum([a, b, c])
all_multi = reduce(lambda i,j: i*j, [a, b, c])

res = [all_plus, all_multi, a+b*c, a*b+c, (a+b)*c, a*(b+c)]
print(max(res))

写出其动态转移方程:

动态转移方程

# 若有n个数,则是dp问题

nums = list(map(int, input().split()))
N = len(nums)
dp = [[nums[i] if i==j else 0 for j in range(N)] for i in range(N)] # dp[i][j] 第i个数到第j个数的最大
# 注意其初始化条件

for i in range(N):
    for j in range(i+1, N):
        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]]) # max(和, 积, 自身)

print(dp[0][N-1])
全部评论
你这里有点错误,i的遍历应该会先从最大的开始, package gsg; import java.util.*; public class Test{ //推广动态转移方程help[i][j]=Math.max(Math.max(help[i][k]+help[k+1][j],help[i][k]*help[k+1][j]),help[i][j]); public static void main(String[] args) { Scanner in=new Scanner(System.in); int m=in.nextInt(); int[] array=new int[m]; int[][] help=new int[m][m]; for(int i=0;i<m>=0;i--){ for(int j=i;j</m>
点赞 回复 分享
发布于 2020-07-17 22:16
楼主确实错了,就拿3 2 1验证,按楼主的的代码输出为7而非9
点赞 回复 分享
发布于 2021-04-09 22:05

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务