算法复习之动态规划(6)

问题:区间最值查询

题目描述

        给出长度为n的数组和m次查询,要求每次询问求区间 [l, r] 内的最大(小)值、

分析

定义状态

        重点利用了倍增思想建立状态(如果有时间,小编一定整理--_--),对于问题关注的重点-----区间进行建模,f(i,j)表示为以i为起点,长度为2^j的区间内的最大(小)值

状态转移

         根据状态的定义,当前区间为 \left [ i,i+2^j \right ],考虑到递推关系需要与两个参数建立起联系,并且借助倍增思想,可以将区间拆分为 \left [ i,i+2^{j-1}-1 \right ] 和 \left [ i+2^{j-1}, i+2^j \right ] 两部分,思想类似于二分查找(相关问题会在最近更新)。由此可得状态转移方程:

f(i,j)=min\left \{ f(i,j-1),f(i+2^{j-1},j-1) \right \}

边界条件

        当区间长度为0时,搜索到的最大(小)值只能是a_i。最终所求的值为min\left \{ f(l,s), f(r-2^s+1,s) \right \}

时间复杂度

        (考试要紧,之后一定抽时间整理倍增思想一系列的相关算法,代码就先跳过了。。。。)

        通过分析我们可以看出,在对于区间进行拆分递归搜索时产生的时间复杂度为O(logn);每次拆分完之后还要对于区间进行遍历求最大(小)值,产生的时间复杂度为O(n);整个过程还包括m次查询,产生的时间复杂度为O(m)。综上,该算法的时间复杂度为O(nlogn+m)


问题:最优矩阵链乘法

题目描述

        n个矩阵连续相乘,第i个矩阵的维度为r_i\times c_i,求如何通过加括号的方式最快完成矩阵乘法?

分析

定义状态

        与之前的动态规划问题思考方式相同,将状态定义为:f(i,j)表示位置i,j之间的矩阵进行链乘法的最快操作次数。

状态转移

        想要获取位置i,j之间进行链乘法的最小操作次数,需要对于区间中每一个位置进行遍历,如果在当前位置加括号后得到的计算次数是多少,最后比较选择最少的操作次数作为位置i,j之间的操作次数。状态转移方程如下:

f(i,j)=\underset{i\leq k\leq j}{min}\left \{ f(i,k)+f(k+1,j)+r_ic_kc_j \right \}

边界条件

         起始状态,对于位置i的矩阵,链乘法需要进行的最小操作次数为0,即f(i,i)=0,所求值为f(0,n-1)

时间复杂度

        (同上,考完试之后一定一定一定会整理代码的--_--)

        虽然普通迭代查询时间复杂度为O(n^2),但是每次更新f(i,j)的值需要将区间内每一个位置遍历一次,产生的时间复杂度为O(n),故算法整体的时间复杂度为O(n^3)

优化方案

        据说是可以用四边形不等式优化,不过考试不考,暂时就先放过它。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小糖豆豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值