问题:区间最值查询
题目描述
给出长度为n的数组和m次查询,要求每次询问求区间 [l, r] 内的最大(小)值、
分析
定义状态
重点利用了倍增思想建立状态(如果有时间,小编一定整理--_--),对于问题关注的重点-----区间进行建模,表示为以i为起点,长度为
的区间内的最大(小)值
状态转移
根据状态的定义,当前区间为 ,考虑到递推关系需要与两个参数建立起联系,并且借助倍增思想,可以将区间拆分为
和
两部分,思想类似于二分查找(相关问题会在最近更新)。由此可得状态转移方程:
边界条件
当区间长度为0时,搜索到的最大(小)值只能是。最终所求的值为
时间复杂度
(考试要紧,之后一定抽时间整理倍增思想一系列的相关算法,代码就先跳过了。。。。)
通过分析我们可以看出,在对于区间进行拆分递归搜索时产生的时间复杂度为;每次拆分完之后还要对于区间进行遍历求最大(小)值,产生的时间复杂度为
;整个过程还包括m次查询,产生的时间复杂度为
。综上,该算法的时间复杂度为
。
问题:最优矩阵链乘法
题目描述
n个矩阵连续相乘,第i个矩阵的维度为,求如何通过加括号的方式最快完成矩阵乘法?
分析
定义状态
与之前的动态规划问题思考方式相同,将状态定义为:表示位置i,j之间的矩阵进行链乘法的最快操作次数。
状态转移
想要获取位置i,j之间进行链乘法的最小操作次数,需要对于区间中每一个位置进行遍历,如果在当前位置加括号后得到的计算次数是多少,最后比较选择最少的操作次数作为位置i,j之间的操作次数。状态转移方程如下:
边界条件
起始状态,对于位置i的矩阵,链乘法需要进行的最小操作次数为0,即,所求值为
。
时间复杂度
(同上,考完试之后一定一定一定会整理代码的--_--)
虽然普通迭代查询时间复杂度为,但是每次更新
的值需要将区间内每一个位置遍历一次,产生的时间复杂度为
,故算法整体的时间复杂度为
。
优化方案
据说是可以用四边形不等式优化,不过考试不考,暂时就先放过它。。。