问题描述

假设当前给出一组算式 5 - 8 + 7 * 4 - 8 + 9,在你只能加括号的情况下,怎样去获取其最大值?

比如:

1. ( 5 - 8 ) + ( 7 x 4 ) - ( 8 + 9) = 8

2. ( 5 - 8 + 7 ) x ( 4 - 8 + 9 ) = 25

算法解析

假设我们用下图来代表这个算式。d1表示第一个数字,dn表示最后一个数字。op表示的是运算符号(运算符号可以为 + - *),op1表示的是d1和d2之间的运算符号,以此类推。

算法思路:要获得这个算式结果的最大值,我们要用到dynamic programming的逻辑,先计算出更小的算式的结果,然后再去找到原等式结果的最大值。

比如我们要计算 ( 5 - 8 + 7 ) 的值,我们的思考逻辑如下:

1. 假设先计算 5 - 8 的值,-3 + 7 = 4 --> 即最后一步做加法运算

2. 假设先计算 8 + 7 的值,5 - 15 = -10 --> 即最后一步做减法运算

因此针对 ( 5 - 8 + 7 ) :

其结果的最小值:min ( 5 - 8 + 7 ) = -10

其结果的最大值:max ( 5 - 8 + 7 ) = 4

推论:
1. 如果我们要求算式 1 - ( 5 - 8 + 7) 的最大值。

可以知道此时 1 - ( -10 ) 的值更大,因此我们要使用 min ( 5 - 8 + 7 )

2. 如果我们要求算式 1 + ( 5 - 8 + 7) 的最大值。

可以知道此时 1 + 4 的值更大,因此我们要使用 max ( 5 - 8 + 7 )

结论:

1. 如果算式中有多个运算符,我们依次假设当前运算符为最后一次运算

2. 针对运算符号左侧和右侧的算式,我们分别要计算出其最小值和最大值
--> 即针对任意的算式,我们都要分别获得其最大值和最小值

获取子算式的最大值和最小值

 5 - 8 + 7 * 4 - 8 + 9 为例,假设当前最后一次做的是乘法:

即 ( 5 - 8 + 7 ) * ( 4 - 8 + 9 )

1. 左边的最小值:min( 5 - 8 + 7 ) = ( 5 - ( 8 + 7 )) = -10

2. 左边的最大值:max( 5 - 8 + 7 ) = (( 5 - 8 ) + 7) = 4

3. 右边的最小值:min( 4 - 8 + 9 ) = ( 4 - ( 8 + 9 )) = -13

4. 右边的最大值:max( 4 - 8 + 9 ) = (( 4 - 8 ) + 9 ) = 5

在知道运算符号两边算式的最大值和最小值后,由于我们不知道怎样相乘能够得到最大值,因此我们要遍历所有情况:

1. a = max(左边) * max(右边) = 4 * 5 = 20

2. b = max(左边) * min(右边) = 4 * -13 = -52

3. c = min(左边) * min(右边) = -10 * -13 = 130

4. d = min(左边) * max(右边) = -10 * 5 = -50

由此可见,当最后一步为乘法的时候,

算式的最大值为:max ( a, b, c, d ) = 130

算式的最小值为:min ( a, b, c, d ) = -52

公式推理:

假设 M( i , j ) 表示算式结果的最大值

假设 m( i , j ) 表示算式结果的最小值

假设我们最后一步要进行的运算方式为 opk (可能是乘法,加法,或是减法):

for k from i to j

如何获 i 和 j,即如何获取子算式?

假设我们有这样的两个表格,一个表格用于填写算式的最大值,一个表格用于填写算式的最小值。注:上图中5和8之间的运算符号是减号,8和7之间的运算符号是加号...

红色格子(0,1):表示 5 - 8 能够得到的最大值(最小值)
绿色格子(1,3):表示 8 + 7 * 4 能够得到的最大值(最小值)
紫色格子(1,4):表示 8 + 7 * 4 - 8 能够得到的最大值(最小值)
蓝色格子(2,5):表示 7 * 4 - 8 + 9 能够得到的最大值(最小值)

因此,要知道5 - 8 + 7 * 4 - 8 + 9能够得到的最大值,我们只需要知道在填写最大值的表格里面,格子(0,5)的值是多少即可。

获取格子中的值

假设我们要获取(1,4)的最大值和最小值,即 8 + 7 * 4 - 8  的最大值和最小值。

根据上方“公式推理”中的逻辑我们可以知道:

1. 当k为1的时候 --> 最后的运算符号为 + :

a = M(1,1) + M(2,4)

b = M(1,1) + m(2,4)

c = m(1,1) + m(2,4)

d = m(1,1) + M(2,4)

max(1,4) = max (a, b, c, d)

min(1,4) = max (a, b, c, d)

2. 当k为2的时候 --> 最后的运算符号为 * :

a = M(1,2) * M(3,4)

b = M(1,2) * m(3,4)

c = m(1,2) * m(3,4)

d = m(1,2) * M(3,4)

max(1,4) = max (a, b, c, d)

min(1,4) = max (a, b, c, d)

3. 当k为3的时候 --> 最后的运算符号为 - :

a = M(1,3) - M(4,4)

b = M(1,3) - m(4,4)

c = m(1,3) - m(4,4)

d = m(1,3) - M(4,4)

max(1,4) = max (a, b, c, d)

min(1,4) = max (a, b, c, d)

由此可见,要获得下图中红色格子(1,4)的值,我们要先知道如下蓝色格子中的值。

同理要获得下图中红色格子(1,2)的值,我们要先知道如下蓝色格子中的值。

由此我们可以推断,要获得右上方格子里的值,我们要先获得靠近对角线上的格子里的值。即先获对角线上的格子里的值(黑色的线),再获取只有两个数字的算式的值(红色的线),然后在获取只有3个数字的算式的值(紫色的线),以此类推最后获取到原算式的值。

代码逻辑如下

Implementation

def evalaa(a,b,op):if op == '+':return a + bif op == '-':return a - bif op == '*':return a * b#计算坐标对应的算式的最大值和最小值
def min_and_max(i, j, M, m):min_value = float('inf') #初始化要计算的格子里的最小值是正无穷max_value = float('-inf') #初始化要计算的格子里的最大值是负无穷for k in range(i,j):a = evalaa(M[i][k], M[k+1][j], op[k])b = evalaa(M[i][k], m[k+1][j], op[k])c = evalaa(m[i][k], m[k+1][j], op[k])d = evalaa(m[i][k], M[k+1][j], op[k])min_value = min(min_value, a, b, c, d)max_value = max(max_value, a, b, c, d)return (min_value, max_value)def parentheses(op, numbers):n = len(numbers)M = [[0 for x in range(n)] for x in range(n)] #创建存放最大值的表格m = [[0 for x in range(n)] for x in range(n)] #创建存放最小值的表格#将表格对角线上的格子的值填充为本身(1个数字的算式不涉及运算因此是本身)for i in range(n):m[i][i] = int(numbers[i])M[i][i] = int(numbers[i])#按照一定逻辑依次获取坐标位置for s in range(1, n):for i in range(0,n-s):j = i + sm[i][j], M[i][j] = min_and_max(i,j,M,m)return M[0][n-1]dataset = '5-8+7*4-8+9'
op = dataset[1:len(dataset):2]
numbers = dataset[0:len(dataset)+1:2]print(parentheses(op, numbers))

[Algorithmic Toolbox学习笔记][week6]Placing Parentheses相关推荐

  1. [Algorithmic Toolbox学习笔记][week6]0/1 Knapsack Problem

    问题描述 具体的问题描述请参考以下链接: [Algorithmic Toolbox学习笔记][week3]战利品的最大价值_Karen_AMPM的博客-CSDN博客假设小偷有一个背包只能放下一定重量的 ...

  2. Dollar toolbox 学习笔记(一)

     Dollar toolbox 学习笔记(一) Dollar toolbox工具包是dollar写的关于行人检测的MATLAB工具包,工具包是对他经典论文的实现. 可在https://pdolla ...

  3. MATLAB Robotics System Toolbox学习笔记(一):一步一步建造一个机械臂

    本文参考 MathWorks 中 Help Center 的 Build a Robot Step by Step ,并加以自己的理解 原网址:https://ww2.mathworks.cn/hel ...

  4. Matlab Robitic Toolbox学习笔记Day2

    1.对于之前已经建立好的SCARA机器人模型,进行动画演示.9.10版本的工具箱中原来的drivebot函数替换为teach函数,用来生成可修改关节变量q的演示图.值得注意的是,在使用teach函数之 ...

  5. s matlab toolbox,Matlab Robotic Toolbox工具箱学习笔记(一 )

    Matlab Robotic Toolbox工具箱学习笔记(一) 软件:matlab2013a 工具箱:Matlab Robotic Toolbox v9.8 Matlab Robotic Toolb ...

  6. MATLAB机器人工具箱Robotics Toolbox安装——以Win10环境下MATLAB2017b为例【个人学习笔记】

    MATLAB学习--经验与交流[个人学习笔记] 此处安装的机器人工具箱版本为10.4:MATLAB2017b. 安装包来源:机器人工具箱官网:https://petercorke.com/toolbo ...

  7. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  8. c++ qt工作量和移动端相比_学习笔记 --- QT

    0.前序 别问,问就是选修... 那毕竟3dMax动画那边结课了,我怎么就不能再发一篇笔记(极其嚣张) QT其实会去好好学的,虽然最近为了选修结课又得恶补一波 不过以后给策划造编辑器是要用的,这篇笔记 ...

  9. MATLAB学习笔记(一)

    MATLAB 一.安装的目录结构 二.常用的菜单及工具 布局 设置路径 设置工作路径 三.常用命令 四. 基础知识 数据类型 复数类型 `inf 和 NaN` 字符与字符串 函数句柄 结构体 结构体的 ...

最新文章

  1. 你不知道的Vue响应式原理
  2. 年轻人的第一块金牌:我是如何成为 Kaggle 全网第一的
  3. nginx 负载均衡配置_Nginx负载均衡NFS配置
  4. http://blog.csdn.net/chrisniu1984/article/details/12050951
  5. [ZJOI2007]仓库建设(斜率优化)
  6. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
  7. Boost:与容器相关的BOOST_TEST_EQ测试
  8. 8086CPU写汇编的规则
  9. C语言字符串处理函数
  10. vue与原生app的对接交互的方法(混合开发)
  11. php pg connect 扩展,php安装gnupg扩展
  12. 帝国cms怎么搭建python环境_用python 发 帝国cms 文章
  13. 正则表达式-grep命令
  14. 冠层、叶片和光系统尺度的日光诱导叶绿素荧光SIF模拟的辐射传输模型:SCOPE模型介绍
  15. 相机成像原理详解(透视成像)
  16. 14.如何在Linux电脑中使用终端运行INSTALL.sh文件
  17. DNX451 与 DNXCORE50 获取当前应用程序目录
  18. Python学习a1——背景及基础
  19. php验证码无法验证问题,php无法显示验证码
  20. 强制结束进程的命令和软件

热门文章

  1. 华为路由器接口IP地址如何配置与查看
  2. java控制台编译_【java c#】通过控制台编译和运行程序//不依赖IDE
  3. mongoose populate 填充
  4. 西部狂徒自建服务器,在《西部狂徒》中如何快速建立自己根据地?杀人放火是上策...
  5. 【品牌DTC增长力】从AIPL模型看策略趋势
  6. SLAM④----李群与李代数
  7. 清华计算机考研报考人数,2020部分院校考研报考人数统计
  8. TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法
  9. ONF组织的SDN架构文档——四个架构(三/一)
  10. 前端工程中常用的文件夹命名(扫盲帖)