动态规划算法学习一:DP的重要知识点、矩阵连乘算法

这篇具有很好参考价值的文章主要介绍了动态规划算法学习一:DP的重要知识点、矩阵连乘算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 三部曲如下三步:
  1. 基本原则:“空间换时间” 存储重复子问题的解,减少运算时间
  2. 底层运算:“表格操作” 用表格存储子问题的解
  3. 实现路线:“子问题划分、自底向上求解” 利用表格中存储的子问题的解,求上一层子问题的解。

一、矩阵连乘问题

1、问题描述

动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法

2、完全加括号

矩阵连乘计算次序 可以用 加括号的方式 来确定。特别的,完全加括号的矩阵连乘积可递归地定义为:

  • 单个矩阵是完全加括号的
  • 矩阵连乘积 A 是完全加括号的,则 A 可示为2个完全加括号的矩阵连乘积 B 和 C 的乘积并加括号,即 A=(BC)

动态规划算法学习一:DP的重要知识点、矩阵连乘算法

3、问题分析

给定n个矩阵𝐴1,⋯, 𝐴𝑛,其中第i个矩阵的维度为𝑝(𝑖−1)×𝑝𝑖,以及它们的一个完全加括号方案:
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法

4、最优子结构性质

构建原问题最优解 与 子问题最优解之间的关系:
动态规划算法学习一:DP的重要知识点、矩阵连乘算法

5、状态表示和递推方程

动态规划算法学习一:DP的重要知识点、矩阵连乘算法

6、自问题个数和求解顺序

动态规划算法学习一:DP的重要知识点、矩阵连乘算法

二、计算最优值示例

1、问题描述

动态规划算法学习一:DP的重要知识点、矩阵连乘算法

2、计算最优值示例*****

动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法

按以下顺序计算:

  1. 第一次计算(遍历):
    m(1,2)=30 * 35 * 15 = 15750
    m(2,3)=35 * 15 * 5 = 2625
    m(3,4)=15 * 5 * 10 = 750
    m(4,5)=5 * 10 * 20 = 1000
    m(5,6)=10 * 20 * 25 = 5000
  2. 第二次计算(遍历)
    • m(1,3) =7875时,有两种情况,k = 1 或者 k =2 时,(下面的数据就可以使用上面算法的,这就是自底向上)
      k=1时,m(1,1)+m(2,3)+30 * 35 * 5= 7875
      k=2时,m(1,2)+m(3,3)+30 * 15 * 5= 23000
      最小的值为7875,
    • m(2,4)=4375时,有两种情况,k = 2 或者k =3 时,(同上)
      k = 2时,m(2,2)+m(3,4)+35 * 15 * 10 = 6000
      k = 3时,m(2,3)+m(3,3)+35 * 5 * 10 = 4375
      最小的值为 4375
    • 后面同上计算,依次是:
    • m(3,5)=2500,k=3 或者 k=4
    • m(4,6)=3500,k=4 或者 k=5
  3. 第三次计算(遍历)
    • m(1,4)=9375时,k 有三次情况,k=1,k=2,k=3,(同上)
      k=1时,m(1,1)+m(2,4)+30 * 35 * 10 = 14875
      k=2时,m(1,2)+m(3,4)+30 * 15 * 10 = 21000
      k=3时,m(1,3)+m(4,4)+30 * 5 * 10 = 9375
    • m(2,5)=7125时,k 有三次情况,k=2,k=3,k=4
      k = 2,m(2,2)+m(3,5)+35 * 15 * 20 = 13000
      k = 3,m(2,3)+m(4,5)+35 * 5 * 20 = 7125
      k = 4,m(2,4)+m(5,5)+35 * 10 * 20 = 11375
    • m(3,6)=5375
  4. 第四次计算(遍历)
    • m(1,5)=11875时,k 有四次情况,k=1,k=2,k=3,k=4,(同上)
      k=1时,m(1,1)+m(2,5)+30 * 35 * 20 = 28125
      k=2时,m(1,2)+m(3,5)+30 * 15 * 20 = 27250
      k=3时,m(1,3)+m(4,5)+30 * 5 * 20 = 11875
      k=4时,m(1,4)+m(5,5)+30 * 10 * 20 = 15375
    • m(2,6)=10500
  5. 第五次计算(遍历)
    • m(1,6)= 15125时,k 有五次情况,k=12345,(同上)
      k = 1时,m(1,1)+m(2,6)+30 * 35 * 25 = 36750
      k = 2时,m(1,2)+m(3,6)+30 * 15 * 25 = 34250
      k = 3时,m(1,3)+m(4,6)+30 * 5 * 25 = 15125
      k = 4时,m(1,4)+m(5,6)+30 * 10 * 25 = 21875
      k = 5时,m(1,5)+m(5,5)+30 * 20 * 25 = 26875
      动态规划算法学习一:DP的重要知识点、矩阵连乘算法

3、构造最优解

动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法

4、算法实现

import java.util.Scanner;

/**
 * DP 算法之 矩阵连乘
 */
public class Main {

    public  static long[][] memoTable;   // 存放局部最优值
    public  static int[][]  bestK ;      // 存放 划括号k 的位置
    public  static int[]    dim ;        // 存放矩阵的值
    public  static int      matrixNum;   // 二位矩阵 的维度


    /**
     * 自底向上地计算最优值,结果保存在全局变量memoTable和bestK中
     * @param matrixNum
     * @return
     */
    static long MatrixChain(int matrixNum) {
        int i,j,len,k;
        for(i=1; i<=matrixNum; i++) //单个矩阵的情形,定义数乘次数为0
            memoTable[i][i] = 0;
        for(len=2; len<=matrixNum; len++){ //计算长度为len的矩阵链最优值
            for(i=1; i<=matrixNum-len+1; i++) { //矩阵链的开始矩阵下标
                j = i+len-1;                    //矩阵链的结束矩阵下标
                memoTable[i][j] = 100000000;    //预定义的一个充分大数
                for(k=i; k<j; k++) {  //枚举划分位置
                    long ans = memoTable[i][k] + memoTable[k+1][j] +
                            dim[i-1]*dim[k]*dim[j];
                    if (ans < memoTable[i][j]){ //更新最优信息
                        bestK[i][j] = k;
                        memoTable[i][j] = ans;
                    }
                }//end of for k
            }//end of for i
        }//end of for len
        return memoTable[1][matrixNum];
    }

    /**
     * 递归构造最优解
     * @param i
     * @param j
     * @param bestK
     * @return
     */
    public static String traceback(int i,int j,int[][] bestK) {
        if(i==j) {
            return String.format("A%s", i);
        }
        if(i==j-1){
            return String.format("A%sA%s", i, j);
        }
        int position = bestK[i][j];
        StringBuilder sb = new StringBuilder();
        if(i!=position) {
            sb.append("(");
        }
        sb.append(traceback(i, position, bestK));
        if(i!=position) {
            sb.append(")");
        }
        if(position+1!=j) {
            sb.append("(");
        }
        sb.append(traceback(position+1, j, bestK));
        if(position+1!=j) {
            sb.append(")");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入矩阵的个数:");
        matrixNum = in.nextInt();
        System.out.println("请输入矩阵的行数和列数:");
        dim = new int[matrixNum+1];
        for(int i = 0;i <= matrixNum;i++) {
            dim[i] = in.nextInt();
        }
        memoTable = new long[matrixNum+1][matrixNum+1];
        bestK = new int[matrixNum+1][matrixNum+1];
        long min = MatrixChain(matrixNum);
        System.out.println("矩阵连乘的最小次数是:" + min);
        System.out.println(String.format("矩阵的连乘次序:%s", traceback(1, matrixNum, bestK)));
    }
}

三、基本要素-最优子结构

  • 最优子结构性质,通俗地讲就是问题的最优解包含其子问题的最优解。也就是说,如果把问题的最优解分解(比如划分为两个或者多个部分,或者删除第一个或者最后一个分量),得到一个子解,那么这个子解是其相应子问题最优解
    动态规划算法学习一:DP的重要知识点、矩阵连乘算法
  • 最优子结构性质隐含了问题最优解和子问题最优解之间的一种递推关系。它是动态规划的基础,递推方程是最优子结构性质的体现。
  • 在分析问题的最优子结构性质时,人们一般采用 反证法 :首先假设由问题最优解S导出的子问题的解不是最优的,然后再推导在这个假设下可构造出比S更好的解 S’,从而得到矛盾。

四、基本要素-重叠子问题

  • 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质
  • 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
  • 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。 【降低复杂度不是本章的目标了!!

五、递归方法

long MatrixChain(int i, int j){
    if (i == j) {//单个矩阵的情形
             memoTable[i][j] = 0;
        return 0;
    }
    long ans, min = 100000000;//预定义的一个充分大数

    for (int k=i; k<j; k++) {

        ans = MatrixChain(i,k) + MatrixChain(k+1,j)
 + dim[i-1]*dim[k]*dim[j]; //递归计算
        if (ans < min) {
            min = ans;
        }
    }
   return min;   }

动态规划算法学习一:DP的重要知识点、矩阵连乘算法

六、备忘录方法

动态规划算法学习一:DP的重要知识点、矩阵连乘算法文章来源地址https://www.toymoban.com/news/detail-484017.html

//递归调用前用 memset(memoTable,-1,sizeof(memoTable))初始化备忘录表为-1
long MatrixChainMemo(int i,int j){
    if (memoTable[i][j] != -1)
        return memoTable[i][j]; //备忘录表中有答案,则跳出递归调用过程
    if (i == j) {//单个矩阵的情形
             memoTable[i][j] = 0;
        return 0;
    }
    long ans,max = 100000000;//预定义的一个充分大数
    for (int k=i; k<j; k++) {
        ans = MatrixChainMemo(i,k)+MatrixChainMemo(k+1,j)
+dim[i-1]*dim[k]*dim[j]; //递归计算
        if (ans < max) {
            bestK[i][j]=k;
            max = ans;
        }
    }
    memoTable[i][j] = max;  //用递归执行结果更新备忘录表
    return max;
}

七、动态规划算法设计的步骤

  1. 分析最优解的性质,并刻划其最优子结构特征;
  2. 确定状态表示S(x~1~,x~2~,…)状态递推方程,递归地定义最优值;
  3. 确定状态转移顺序,以自底向上的方式计算出最优值;(从最小问题计算起,保存最优子结果,在计算更大的问题时就可以调用之)
  4. 根据计算最优值时得到的信息,构造最优解

到了这里,关于动态规划算法学习一:DP的重要知识点、矩阵连乘算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python算法中的机器学习算法之无监督学习知识点(详解)

    目录 学习目标: 学习内容: Ⅰ. K均值聚类(K-Means Clustering) Ⅱ. 层次聚类(Hierarchical Clusteri

    2024年02月01日
    浏览(46)
  • NLP重要知识点:预训练模型【核心且详细】

    本资料是NLP核心知识点的ppt!!!【文章较长,建议收藏】 本节课我们学习预训练模型。 我们在学习词向量的时候,应该知道了多个产生词向量的方法,包括基于矩阵(词-词共现矩阵)分解的方法、基于语言模型(word2vec)的方法、以及结合二者优点的Glove模型等其他产生词

    2024年04月09日
    浏览(37)
  • 蓝桥杯重要知识点和赛题直通车

     蓝桥杯软件赛零基础备赛20周 第 1周(2023-10-23): 蓝桥杯软件赛介绍+官方链接+零基础能得奖吗? 第 2周(2023-10-30): 常考知识点+蓝桥杯怎么判题+备赛计划 第 3周(2023-11-06): 填空题(分数少但越来越不好做) 第 4周(2023-11-13): (练习再多也不够的)杂题1 第 5周(2023-11-20): 杂题2 第

    2024年01月24日
    浏览(89)
  • 论文笔记--网络重要节点排序方法综述(概念性知识点)

    任晓龙, 吕琳媛 度中心性:节点的直接邻居数目 半局部中心性:节点四层邻居的信息 k-shell分解:度中心性的扩展,根据节点在网络中的位置来定义,越在核心的节点越重要 1.1度中心性(DC) 节点的度分为入度和出度;权重为与节点相连的边的权重之和 优缺点: 优点:简单

    2024年02月05日
    浏览(35)
  • quarkus依赖注入之十三:其他重要知识点大串讲(终篇)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇是《quarkus依赖注入》系列的终篇,前面十二篇已覆盖quarkus依赖注入的大部分核心内容,但依然漏掉了一些知识点,今天就将剩下的内容汇总,来个一锅端,轻松愉快的结束这个系列 总的来说,

    2024年02月13日
    浏览(33)
  • Hadoop/HDFS/MapReduce/Spark/HBase重要知识点整理

    本复习提纲主要参考北京大学计算机学院研究生课程《网络大数据管理与应用》课程资料以及厦门大学计算机科学系研究生课程 《大数据技术基础》相关材料整理而成,供广大网友学习参考,如有版权问题请联系作者删除:guanmeige001@pku.edu.cn Hadoop简介 Hadoop的功能和作用: 高

    2024年02月02日
    浏览(60)
  • 从Referer到XMLHttpRequest:探究Web安全中的重要知识点

    目录 Referer 概念 Referrer-policy(可以一定程度上防御CSRF攻击) 同源 iframe sandbox(沙箱): cookie的原理: 如何设置Referrer? 盗链 盗链的工作原理 三种情况下可以引用图片: XMLHTTPRequest AJAX(Asynchronous JavaScript and XML) XMLHttpRequest的实例属性 XMLHttpRequest.readyState XMLHttpRequest.onreadystat

    2024年02月08日
    浏览(38)
  • AcWing算法学习笔记:动态规划(背包 + 线性dp + 区间dp + 计数dp + 状态压缩dp + 树形dp + 记忆化搜索)

    算法 复杂度 时间复杂度0(nm) 空间复杂度0(nv) 代码 算法 通过滚动数组对01背包朴素版进行空间上的优化 f[i] 与 f[i - 1]轮流交替 若体积从小到大进行遍历,当更新f[i, j]时,f[i - 1, j - vi] 已经在更新f[i, j - vi]时被更新了 因此体积需要从大到小进行遍历,当更新f[i, j]时,f[i - 1,

    2024年02月21日
    浏览(43)
  • DP算法:动态规划算法

    (1)确定初始状态 (2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来 (3)确定边界条件。 蓝桥杯——印章(python实现) 使用dp记录状态,dp[i][j]表示买i张印章,凑齐j种印章的概率 i表示买的印章数,j表示凑齐的印章种数 情况一:如果ij,不可能凑齐印章,概

    2024年02月07日
    浏览(51)
  • 算法——动态规划(DP)——递推

    动态规划常用于解决优化问题。 动态规划通常以自底向上或自顶向下的方式进行求解。 自底向上的动态规划从最简单的子问题开始,逐步解决更复杂的问题,直到达到原始问题。 自顶向下的动态规划则从原始问题出发,分解成子问题,并逐步求解这些子问题。 动态规划算法

    2024年01月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包