[Algorithmic Toolbox学习笔记][week6]Placing Parentheses
问题描述
假设当前给出一组算式 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相关推荐
- [Algorithmic Toolbox学习笔记][week6]0/1 Knapsack Problem
问题描述 具体的问题描述请参考以下链接: [Algorithmic Toolbox学习笔记][week3]战利品的最大价值_Karen_AMPM的博客-CSDN博客假设小偷有一个背包只能放下一定重量的 ...
- Dollar toolbox 学习笔记(一)
Dollar toolbox 学习笔记(一) Dollar toolbox工具包是dollar写的关于行人检测的MATLAB工具包,工具包是对他经典论文的实现. 可在https://pdolla ...
- MATLAB Robotics System Toolbox学习笔记(一):一步一步建造一个机械臂
本文参考 MathWorks 中 Help Center 的 Build a Robot Step by Step ,并加以自己的理解 原网址:https://ww2.mathworks.cn/hel ...
- Matlab Robitic Toolbox学习笔记Day2
1.对于之前已经建立好的SCARA机器人模型,进行动画演示.9.10版本的工具箱中原来的drivebot函数替换为teach函数,用来生成可修改关节变量q的演示图.值得注意的是,在使用teach函数之 ...
- s matlab toolbox,Matlab Robotic Toolbox工具箱学习笔记(一 )
Matlab Robotic Toolbox工具箱学习笔记(一) 软件:matlab2013a 工具箱:Matlab Robotic Toolbox v9.8 Matlab Robotic Toolb ...
- MATLAB机器人工具箱Robotics Toolbox安装——以Win10环境下MATLAB2017b为例【个人学习笔记】
MATLAB学习--经验与交流[个人学习笔记] 此处安装的机器人工具箱版本为10.4:MATLAB2017b. 安装包来源:机器人工具箱官网:https://petercorke.com/toolbo ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- c++ qt工作量和移动端相比_学习笔记 --- QT
0.前序 别问,问就是选修... 那毕竟3dMax动画那边结课了,我怎么就不能再发一篇笔记(极其嚣张) QT其实会去好好学的,虽然最近为了选修结课又得恶补一波 不过以后给策划造编辑器是要用的,这篇笔记 ...
- MATLAB学习笔记(一)
MATLAB 一.安装的目录结构 二.常用的菜单及工具 布局 设置路径 设置工作路径 三.常用命令 四. 基础知识 数据类型 复数类型 `inf 和 NaN` 字符与字符串 函数句柄 结构体 结构体的 ...
最新文章
- 你不知道的Vue响应式原理
- 年轻人的第一块金牌:我是如何成为 Kaggle 全网第一的
- nginx 负载均衡配置_Nginx负载均衡NFS配置
- http://blog.csdn.net/chrisniu1984/article/details/12050951
- [ZJOI2007]仓库建设(斜率优化)
- (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
- Boost:与容器相关的BOOST_TEST_EQ测试
- 8086CPU写汇编的规则
- C语言字符串处理函数
- vue与原生app的对接交互的方法(混合开发)
- php pg connect 扩展,php安装gnupg扩展
- 帝国cms怎么搭建python环境_用python 发 帝国cms 文章
- 正则表达式-grep命令
- 冠层、叶片和光系统尺度的日光诱导叶绿素荧光SIF模拟的辐射传输模型:SCOPE模型介绍
- 相机成像原理详解(透视成像)
- 14.如何在Linux电脑中使用终端运行INSTALL.sh文件
- DNX451 与 DNXCORE50 获取当前应用程序目录
- Python学习a1——背景及基础
- php验证码无法验证问题,php无法显示验证码
- 强制结束进程的命令和软件
热门文章
- 华为路由器接口IP地址如何配置与查看
- java控制台编译_【java c#】通过控制台编译和运行程序//不依赖IDE
- mongoose populate 填充
- 西部狂徒自建服务器,在《西部狂徒》中如何快速建立自己根据地?杀人放火是上策...
- 【品牌DTC增长力】从AIPL模型看策略趋势
- SLAM④----李群与李代数
- 清华计算机考研报考人数,2020部分院校考研报考人数统计
- TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法
- ONF组织的SDN架构文档——四个架构(三/一)
- 前端工程中常用的文件夹命名(扫盲帖)