动态规划矩阵连乘求最优值和最优解

2023-05-16

  • 问题描述

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。比如A1(10*100),A2(100*5),A3(5*50)三个矩阵,相乘次序分别为((A1*A2)A3)和(A1(A2*A3))时,矩阵相乘的次数分别为750010*100*5+10*5*50和75000(100*5*50+100*50*10),所以我们需要找到相乘次数最少的矩阵相乘次数(最优值)和矩阵相乘次序(最优解)。

  • 基本思路

递归公式

m[i][j]=m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]

这里的i是第一个相乘矩阵的序列数,j是最后一个所乘的矩阵序列数,其中k是最后一次相乘时序列数i到j中间的任意一个断点数。

m[i][j]存放的是从第i个矩阵到第j个矩阵的矩阵连乘的计算次数

实例:

例:现在有六个矩阵相乘,分别是A1、A2、A3、A4、A5、A6,矩阵的行数和列数分别是A1(30,35)、A2(35,15)、A3(15,5)、A4(5,10)、A5(10,20)、A6(20,25),则六个矩阵相乘经过计算解得最优值为:15125,且最优解为(A1*(A2*A3))*((A4*A5)*A6)

笔算过程如下:

过程是分层运算的,只有1个矩阵时、有2个矩阵时、有三个矩阵时、、、

 

 

 全部代码如下:

#include<iostream>
using namespace std;

int p[100];
int m[100][100], s[100][100];
int n;
//寻找最优值和断点位置
void matrixchain()
{
    int i, r, j, k;

    //初始化数组
    for (i = 0; i < 100; i++)
    {
        for (j = 0; j < 100; j++)
        {
            m[i][j] = 0;
            s[i][j] = 0;
        }

    }

    for (r = 2; r <= n; r++)//矩阵连乘的规模为r,此时计算的矩阵连乘的个数是r个且是顺序连续并所有的。从2开始,因为只有一个矩阵相乘的次数为0。
    {
        for (i = 1; i <= n - r + 1; i++)//第一个矩阵的下标范围
        {
            j = i + r - 1;//最后一个矩阵的下标范围
            m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];//因为m[i][i]为0,先对m[i][j]赋一个在该位置(第一个断点位置)相连乘的值
            s[i][j] = i;//s[][]存储各子问题的决策点,前面m里面存的是在第一个断点位置的值,所以这里存1
            for (k = i + 1; k < j; k++)//寻找在最优位置断点的最优值
            {
                int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                if (t < m[i][j])
                {
                    m[i][j] = t;//将最优值赋给m
                    s[i][j] = k;//记录断点位置
                }
            }
        }
    }
}
//寻找最优解
void print(int i, int j)
{
    if (i == j)
    {
        cout << "A[" << i << "]";
        return;
    }

    cout << "(";
    print(i, s[i][j]);
    cout << "*";
    print(s[i][j] + 1, j);
    cout << ")";
}

int main()
{
    cout << "请输入矩阵的个数n : " << endl;
    cin >> n;
    int i, j;
    cout << "请依次输入每个矩阵的行数和最后一个矩阵的列数:" << endl;
    for (i = 0; i <= n; i++)
        cin >> p[i];//将第一个矩阵的列和第二个矩阵的行的下标置为相同的了
    matrixchain();
    cout << "最优值为:" << m[1][n] << endl;
    cout << "最优解计算方法为:";
    print(1, n);
    cout << endl;
    return 0;
}

结果如图:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划矩阵连乘求最优值和最优解 的相关文章

随机推荐

  • 前端框架汇总合集(友友们可补充漏掉的前端框架)

    前端框架汇总 ReactVueAngularBootstrapFoundationSvelteAlpinePreactLitElementStimulusEmber React React JS 不像一个框架反而更像一个库 xff0c 但绝
  • Node.js 16 生命周期 结束日期提前

    将 Node js 16 的生命周期终止日期更改为 2023 年 9 月 11 日 概括Summary为什么 xff1f Why 我们评估了以下选项 We have evaluated the following options 概括 No
  • ubuntu系统用xshell远程连接

    1 在cmd窗口执行任何命令时请先登录管理员权限 xff08 将可避免很多问题 xff09 命令 xff1a sudo su xff08 回车然后输入密码 xff09 2 设置软件下载地址 xff08 推荐使用 阿里云服务器 xff09 3
  • 用VS进行图像处理

    一 1 在Windows下搭建VS 43 OpenCV平台 xff1a 2 修改名称 3 选择基于对话框 4 生成工程项目 xff0c 把自动生成的控件删除 xff0c 找到右边工具箱 xff0c 添加两个图片控件和一个按钮控件 5 分别更
  • 笔记(STM32篇)day1——工程创建、操作寄存器点灯

    目录 一 STM32F103VET6 二 创建工程 1 主要文件 2 生成文件 三 操作寄存器点灯 前言 这一年 xff0c 从调剂到各种找工作面试 去实习 xff0c 感受总结下来就是 出走半生 xff0c 归来仍是萌新 xff0c 作为
  • 网络服务——解析OSI七层模型及各层工作原理

    文章目录 一 OSI是什么 xff1f 二 OSI七层模型讲解1 七层结构的概念 xff1a 2 了解数据的传输协议 xff1a 三 OSI模型与TCP IP模型的比较四 TCP IP协议族的组成 xff1a 1 应用层 xff1a 2 传
  • Ubuntu系统安装配置arm-gcc交叉编译器

    下载好linux arm gcc压缩包 xff08 这里使用arm gcc版本为4 6 4 x86 64 xff09 注 xff1a 如果是VMware虚拟机要先安装VMware Tools xff0c 再将arm gcc压缩包导入虚拟机中
  • PTA数据库填空题

    检索学习全部课程的学生姓名 Sno Cno Cno 查询学生95001的姓名和所在系 Sno 61 39 95001 39 S 检索至少选修课程号为C2或C4的学生学号 CNO 61 39 C2 39 V SC 检索至少选修课程号为C2和C
  • python求列表最大值,最小值,和

    问题描述 给出n个数 xff0c 找出这n个数的最大值 xff0c 最小值 xff0c 和 输入格式 第一行为整数n xff0c 表示数的个数 第二行有n个数 xff0c 为给定的n个数 xff0c 每个数的绝对值都小于10000 输出格式
  • Ubuntu从16.04升级到18.04

    文章目录 起因具体步骤1 首先 xff0c 需要完全卸载ROS2 然后 xff0c 使用下列命令更新当前系统3 最后 xff0c 升级系统 起因 最近接手一台16 04Ubuntu的电脑 xff0c 界面操作很不习惯 xff0c 考虑升级到
  • 计算机网络 思科模拟器进行OSPF路由协议实验

    OSPF xff08 Open Shortst Path First xff0c 开放式最短路径优先 xff09 协议是目前网络中应用最广泛的动态路由协议之一 xff0c 也属于内部网关路由协议 xff0c 能够适应各种规模的网络环境 xf
  • C语言操作符—左移右移操作符

    文章目录 1 移位操作符十进制转二进制 1 2 lt lt 左移操作符1 2 1 gt gt 左移操作符 正数1 2 2 gt gt 左移操作符 负数 1 3 gt gt 右移操作符 96 注意 xff1a 移位操作符的操作数只能是整数 9
  • 求最大公约数之辗转相除法

    文章目录 一 前言二 辗转相除法原理三 用C语言求最大公约数 一 前言 最大公约数为两个及其以上的整数中约数最大的一个 也称为最大公因子 xff0c 最大公因数 a xff0c b的最大公约数记为 xff08 a xff0c b xff09
  • 使用FileZilla配置FTP服务器

    在拷贝大文件的时候 xff0c 由于Windows系统限制有时会拷贝失败 xff0c FTP Server可以解决文件的传输问题 FileZilla是一个很好的免费工具 xff0c 且版本没有强制要求 FileZilla支持F TP FTP
  • VMware 安装 银河麒麟高级服务器操作系统 V10 版本教程

    VMware 安装 银河麒麟高级服务器操作系统 V10 版本教程 目录 VMware 安装 银河麒麟高级服务器操作系统 V10 版本教程 银河麒麟的前世今生 安装过程 银河麒麟的前世今生 银河麒麟 xff08 KylinOS xff09 原
  • 配置python环境变量

    首先 xff0c 我们找到python安装目录 再找到pip exe的目录 然后我们快捷键Win 43 i进入Windows设置 xff0c 在查找设置里输入编辑系统环境变量 xff0c 进入到系统属性界面 点击环境变量 xff0c 找到P
  • 百钱百鸡问题

    中国古代数学家张丘建在在他的 算经 中提出这样一个 百钱百鸡问题 xff0c 鸡翁一 xff0c 值钱五 鸡母一 xff0c 值钱三 xff0c 鸡雏三 xff0c 值钱一 xff0c 百钱买百鸡 xff0c 问有翁 xff0c 母 xff
  • ajax前台传递数组到后台

    前台发送 ajax 请求到后台 xff0c 发现直接传递数组 xff0c 后台是接收不到的 xff0c 需要 ajax 加上一个 traditional 属性
  • SQL必知必会 - 插入/更新/删除数据

    目录 一 插入数据 INSERT 1 插入行 INSERT INTO 2 从表取数 插入他表 SELECT INTO 3 插入检索出的数据 二 复制数据CREATE 三 更新数据 update 拓展 replace函数 四 删除数据 DEL
  • 动态规划矩阵连乘求最优值和最优解

    问题描述 矩阵相乘最重要的方法是一般矩阵乘积 它只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义 给定n个矩阵 xff1a A1 A2 An xff0c 其中Ai与Ai 43 1是可乘的 xff0c i 61 1 xff0c 2 xf