【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

news/2024/7/7 19:41:43

最优矩阵链乘(动态规划)

一个n∗mn*mnm的矩阵由 nnnmmm 列共 n∗mn*mnm 排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个nm的矩阵乘mp的矩阵,运算量为nmp。

矩阵乘法不满足分配律,但满足结合律。因此A∗B∗CA*B*CABC既可以按顺序 (A∗B)∗C(A*B)*CABC 也可以按 A∗(B∗C)A*(B*C)ABC 来进行。假设A、B、CA、B、CABC 分别是 2∗3、3∗4、4∗52*3、3*4、4*5233445 的,则 (A∗B)∗C(A*B)*CABC 运算量是2∗3∗4+2∗4∗5=642*3*4+2*4*5=64234+245=64A∗(B∗C)A*(B*C)ABC的运算量是 3∗4∗5∗2∗3∗5=903*4*5*2*3*5=90345235=90 .显然第一种顺序节省运算量。

给出n个矩阵组成的序列,设计一种方法把他们依次乘起来,使得总的运算量尽量小。假设第i个矩阵A[i]是P[i−1]∗P[i]P[i-1]*P[i]P[i1]P[i]的(意味着这些矩阵可以按顺序链乘,所以只需要考虑区间相乘中区间的选取)。

输入

3
2 3 4 5

输出

64

实际上就是区间DP的模板。
我们用f(i,j)f(i,j)f(i,j)表示A[i]、A[i+1]...A[j]乘起来的最少运算数

状态转移方程

f(i,j)=min{f(i,j),f(i,k) + f(k+1,j) + P[i-1]*P[k]*P[j]}(i=<k<j)

边界为f(i,i)=0f(i, i) = 0f(i,i)=0

我们使用闫氏DP分析法,实际上我们只需要考虑最后一步的操作即可。
在这里插入图片描述

本题我没有找到题目,找到了一道POJ上和这个几乎一模一样的题目,只不过那个题目是输入n只有n个数,所以相当于只有n-1个矩阵,所以会有微小的差别。

在这里插入图片描述
所以我们这里的答案是f[1][n - 1],转移方程的时候也有差别:

f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + a[i] * a[k + 1] * a[j + 1]);
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>using namespace std;
typedef long long ll;
const int N = 2007, M = 5000007, INF = 0x3f3f3f3f;int n, m;
int f[N][N];
int a[N];int main()
{while(scanf("%d", &n) != EOF && n){memset(f, 0x3f, sizeof f);for(int i = 1; i <= n; ++ i){scanf("%d", &a[i]);f[i][i] = 0;}for(int len = 2; len < n; ++ len){for(int i = 1; i <= n - len; ++ i){int j = i + len - 1;//注意再 -1 因为三个数才能组成两个可乘矩阵相乘f[i][j] = INF;for(int k = i; k < j; ++ k)
//!相当于是i到j但是需要的是i到j+1:例如第1个和第2个合并,对应到数上就是a[1]a[2]a[3]合并f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + a[i] * a[k + 1] * a[j + 1]);}}printf("%d\n", f[1][n - 1]);//终点是 n-1 因为三个数才能组成两个可乘矩阵相乘}return 0;
}

http://lihuaxi.xjx100.cn/news/290424.html

相关文章

linux中实现pxe的自动安装

linux中实现pxe的自动安装 什么是PXE PXE(preboot execute environment)是由Intel公司开发的最新技术,工作于Client/Server的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持来自网络的操作系统的启动过程&#xff0c;其启动过程中&#xf…

随想录一刷Day17——二叉树

文章目录Day17_二叉树12. 平衡二叉树13. 二叉树的所有路径左叶子之和Day17_二叉树 12. 平衡二叉树 110. 平衡二叉树 思路&#xff1a; 递归法&#xff1a;左右子树的高度差超过1&#xff0c;则不是平衡二叉树 class Solution { public:// 求树的高度&#xff0c;是后续遍历in…

RAID0、RAID1、RAID0+1模式实战评测

文章比较老了&#xff0c;但是很实用。对于要配置RAID的朋友来说值得一学。原文&#xff1a;Tom’s Hardware 作者&#xff1a;Patrick Schmid, Achim Roos 当你增加硬盘数量的时候&#xff0c;磁盘阵列的性能会怎样变化&#xff1f;我们此次RAID评测的第一部分将给出2~8个硬盘…

荣耀总裁赵明:AI 是核心战略,全球前五的目标不会变

作者 | DavidZh 出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09; 4 月 26 日的 GMIC 大会上&#xff0c;华为荣耀总裁赵明分享了荣耀品牌在人工智能和全球化上的策略和进展&#xff0c;并接受了 CSDN 等媒体的群访。 从产品上看&#xff0c;荣耀…

【动态规划、计算几何】最优三角剖分

整理的算法模板合集&#xff1a; ACM模板 目录最优三角剖分UVA1331 最大面积最小的三角剖分 Minimax Triangulation最优三角剖分 问题描述&#xff1a; 给一个有n个顶点的凸多边形&#xff0c;有很多方法进行三角剖分(polygon triangulation) 。给每个三角形规定一个权函数w(…

327 - Evaluating Simple C Expressions

2019独角兽企业重金招聘Python工程师标准>>> 题意:C 表达式运算, 变量为 a-z, 代表运算数为 1-26; 运算符包括 , -, , --; 要求输出原表达式的运算结果, 及运算完后各个变量的值.1. 每个变量只会出现一次;2. 不会出现 ab 这样带歧义的表达式;3. 或 -- 不会既出现在…

UVA10003 切木棍 Cutting Sticks(区间DP、细节)

整理的算法模板合集&#xff1a; ACM模板 本题其实就是一个区间DP 的模板题&#xff0c;总长度为len&#xff0c;有n个切割点&#xff0c;也就是说能被切割成n1段&#xff0c;所以左边界是0&#xff0c;有边界是n 1&#xff0c;所以答案就是f[0][n 1]。 其中我们要把两个端点…

奇点汽车打算明年推L3自动驾驶,不用激光雷达

&#xfeff;&#xfeff;作者 | DavidZh出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;今年 4 月北京车展期间&#xff0c;新造车公司之一的奇点汽车&#xff08;Singulato&#xff09;除了宣布奇点 iS6 将在今年年底开始量产&#xff0c;还请来了…