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

news2024/10/7 6:42:44

文章目录

  • 前言
  • 一、矩阵连乘问题
    • 1、问题描述
    • 2、完全加括号
    • 3、问题分析
    • 4、最优子结构性质
    • 5、状态表示和递推方程
    • 6、自问题个数和求解顺序
  • 二、计算最优值示例
    • 1、问题描述
    • 2、计算最优值示例*****
    • 3、构造最优解
    • 4、算法实现
  • 三、基本要素-最优子结构
  • 四、基本要素-重叠子问题
  • 五、递归方法
  • 六、备忘录方法
  • 七、动态规划算法设计的步骤

前言

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

一、矩阵连乘问题

1、问题描述

1、
在这里插入图片描述

2、完全加括号

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

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

在这里插入图片描述

3、问题分析

给定n个矩阵𝐴1,⋯, 𝐴𝑛,其中第i个矩阵的维度为𝑝(𝑖−1)×𝑝𝑖,以及它们的一个完全加括号方案:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、最优子结构性质

构建原问题最优解 与 子问题最优解之间的关系:
在这里插入图片描述

5、状态表示和递推方程

在这里插入图片描述

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

在这里插入图片描述

二、计算最优值示例

1、问题描述

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

按以下顺序计算:

  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
      在这里插入图片描述

3、构造最优解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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)));
    }
}

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

  • 最优子结构性质,通俗地讲就是问题的最优解包含其子问题的最优解。也就是说,如果把问题的最优解分解(比如划分为两个或者多个部分,或者删除第一个或者最后一个分量),得到一个子解,那么这个子解是其相应子问题最优解
    在这里插入图片描述
  • 最优子结构性质隐含了问题最优解和子问题最优解之间的一种递推关系。它是动态规划的基础,递推方程是最优子结构性质的体现。
  • 在分析问题的最优子结构性质时,人们一般采用 反证法 :首先假设由问题最优解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;   }

在这里插入图片描述

六、备忘录方法

在这里插入图片描述

//递归调用前用 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. 根据计算最优值时得到的信息,构造最优解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具有生物活性的天然产物——雷公藤

雷公藤为卫矛科雷公藤属植物&#xff0c;是我国一种资源比较丰富的传统中草药&#xff0c;迄今为止&#xff0c;已有超过 500 多种化合物从雷公藤中分离出来&#xff0c;包括萜类、生物碱类、黄酮类、木脂素类等。其结构多样的有效成分具有抗炎、抗感染、免疫抑制和抗肿瘤等作用…

腾讯云TRTC服务实现Web视频会议

腾讯云TRTC服务实现Web视频会议 背景 近期公司承接了某高校智慧校园的项目建设工作&#xff0c;其中在家校协作的板块中需要进行视频教学&#xff0c;以及线上屏幕共享&#xff0c;为了完成这一需求&#xff0c;我在自研与第三方服务的选择之间选择了第三方&#xff0c;主要因…

【交通标志识别】基于BP神经网络实现交通标志识别系统(含语音报警)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

java在Windows配置Path环境变量

java在Windows配置Path环境变量 在命令行窗口输入java时&#xff0c;命令行提示’java’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 第一步&#xff1a;鼠标右键点击我的电脑&#xff0c;点击“属性” 第二步&#xff1a;点击“高级系统设置” 第三步&…

ProNas-振动噪声工程界新一代的前沿技术

作者&#xff1a;张工 随着汽车、船舶、高铁动车、轨道车辆、商用飞机、起重机械等交通运输工具和风电机组、家用电器、航天器等振动噪声。仿真模型的日益精细和庞大&#xff0c;现代噪声、振动及舒适性&#xff08;NVH&#xff09;仿真计算及验证领域面临着计算效益&#xf…

FL Studio21水果体验尝鲜版音乐宿主程序FL2023

FL Studio21从大家看来的音乐玩具&#xff0c;逐渐发展成相当严肃的DAW。如今&#xff0c;正被全球大量用户使用。它总是有着自己的方式&#xff0c;在工作流程和设计上&#xff0c;都不与竞争者相仿。 FL Studio是一款功能强大的虚拟音乐制作软件,通过它创作wav,MP3,MIDI,loo…

iOS多项选项卡TYTabPagerBar和分页控制器TYPagerController使用小结

最近做项目的时候&#xff0c;用到了顶部选项卡和底部分页控制器相关的功能。之前做的话都是自己手动封装&#xff0c;通过两个UIScrollView联动来实现。公司同事给推荐了一个封装好的库&#xff0c; TYPagerController&#xff0c;内部也是通过ScrollView的联动来实现的&…

微信小程序 java ssm电影迷爱好者交流平台

电影交流平台是基于java编程语言&#xff0c;mysql数据库&#xff0c;idea开发工具开发的后台&#xff0c;前端是微信小程序开发工具开发。本设计分为用户和管理员两个角色&#xff0c;其中用户可以登陆微信端&#xff0c;查看电影信息&#xff0c;查看电影分类&#xff0c;对电…

Inobitec DICOM Viewer Pro 2.8.0 Crack

Inobitec DICOM Viewer Pro 2.8.0扩大医生可见和可能的极限。通过为医疗行业提供优质的创新 IT 解决方案&#xff0c;我们可以为改善全球人民的健康做出很多贡献。 动态渐进版&#xff08;每季度发布&#xff09;扩展功能 高级 3D 重建 以 OBJ、STL、PLY 格式导出表面 先进的…

SpringBoot2.x 自动化生成代码整合Mybatis

前言 Mybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大多数人选择的原因。 1. …

【快速学习系列】Mybatis缓存和使用SpringBoot开启MyBatis缓存+ehcache

【快速学习系列】Mybatis缓存和使用SpringBoot开启MyBatis缓存ehcache Mybatis缓存 MyBatis一级缓存 Mybatis对缓存提供支持&#xff0c;但是在没有配置的默认情况下&#xff0c;它只开启一级缓存&#xff0c;一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一…

全员全域安全守护,蔚来ET7获Euro NCAP五星安全评级背后的硬核实力

2022年11月16日&#xff0c;蔚来智能电动旗舰轿车ET7 获得Euro NCAP&#xff08;欧盟新车安全评鉴协会&#xff09;五星安全评级&#xff0c;成为继ES8之后蔚来又一款获得欧洲五星安全评级的车型。ET7分别在乘客安全、儿童安全、弱势道路使用者安全、辅助安全得分91%、87%、73%…

两个事务并发写,能保证数据唯一吗?

哟&#xff0c;又是我小白。最近有点高产了。 连我自己都害怕了。 直接进入正题吧。 两个事务并发写&#xff0c;能保证数据唯一吗&#xff1f; 我先来解释下标题讲的是个啥。 我们假设有这么一个用户注册的场景。用户并发请求注册新用户。 你有一张数据库表&#xff0c;也就…

【数据可视化】第二章——基于matplotlib的数据可视化

目录系列课程学习目标1. 基于matplotlib的数据可视化2 matplotlib.pyplot函数库简介3 matplotlib.pyplot相关函数简介3.1 plt.plot(x, y, format_string, **kwargs)3.2 plt.title()3.3 plt.xlabel()/ylabel()3.4 plt.legend()3.5 pyplot的中文显示3.5.1 第一种方法3.5.2 第二种…

C#上位机系列(2)—常用控件的介绍:文本标签,按键,输入框

本文是讲解C#.net平台的Winform框架下的第二个内容&#xff0c;手把手介绍项目的创建方式以及一些写软件时常用的功能&#xff0c;讲解从零开始的每一个步骤。 本次介绍三个最常用控件的使用 1.文本控件Label 功能&#xff1a;显示一个文本 2.按键控件Button 功能&#x…

考研 | 组成原理【第二章】数据的表示和运算

考研 | 组成原理【第二章】数据的表示和运算 文章目录考研 | 组成原理【第二章】数据的表示和运算I. 数制与编码a. 进位计数制及其相互转换b. BCD码1. 8421码2. 余3码3. 2421码c. 无符号整数表示和运算1. 表示2. 运算d. 带符号整数的表示和运算1. 原码2. 反码3. 补码4. 移码5. …

多肽标签VSV-G Tag、YTDIEMNRLGK

VSV-G肽是一种源自水泡性口腔炎病毒糖蛋白的11个氨基酸的肽。编号: 191225 中文名称: 多肽标签VSV-G Tag 英文名: VSV-G Tag 英文同义词: VSV tag 单字母: H2N-YTDIEMNRLGK-OH 三字母: H2N-Tyr-Thr-Asp-Ile-Glu-Met-Asn-Arg-Leu-Gly-Lys-COOH 氨基酸个数: 11 分子式: C57H94N16…

【HMS Core】ScanPlus和Push推送库出现冲突该如何解决?

1、问题描述 项目中之前是同时集成了华为统一扫码服务SDK和华为推送SDK&#xff0c;这两天升级华为推送版本至6.3.0.304时发现这两个库出现了冲突&#xff0c; 这两个库的依赖版本情况如下所示&#xff1a; implementation com.huawei.hms:scanplus:2.7.0.301 implementatio…

[附源码]java毕业设计小型医院药品及门诊管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《垃圾回收算法手册 自动内存管理的艺术》——内存分配(笔记)

文章目录七、内存分配7.1 顺序分配7.2 空闲链表分配7.2.1 首次适应分配7.2.2 循环首次适应分配7.2.3 最佳适应分配7.2.4空闲链表分配的加速快速适应分配(fast-fit allocation)位图适应分配(bitmapped-fits allocation)7.3 内存碎片化7.4 分区适应分配7.4.1 内存碎片7.4.2 空间大…