C/C++教程

Matrix Chain Multiplication using Dynamic Programming Formula

本文主要是介绍Matrix Chain Multiplication using Dynamic Programming Formula,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Matrix Chain Multiplication using Dynamic Programming Formula

what is matrix multiplication

image-20220411112259682

  • 做矩阵相乘的前提是第一个矩阵的列必须和第二个矩阵的行相等。

  • 结果的矩阵的dimension是2×2( first row × second column)

  • 我做了2×3×2次乘法 first row ×(first column/second row)× second column

What is matrix chain Multiplication

image-20220412191143169

这个问题不关心内部是如何计算的,我只在乎为了计算他们我花费了多少次乘法运算。

How to use DP Formula

image-20220412191548686

卡特兰数:规定h(0)=1,而h(1)=1,h(2)=2,h(3)=5,h(4)=14,h(5)=42,h(6)=132,h(7)=429,h(8)=1430,h(9)=4862,h(10)=16796,h(11)=58786,h(12)=208012,h(13)=742900,h(14)=2674440,h(15)=9694845·····················

通项公式为:

image-20220412192003400

作者:力扣(LeetCode)
链接:https://zhuanlan.zhihu.com/p/97619085

2.1 进出栈序列

这是一道 最经典 的入门级卡特兰数题目,如果能把这题看懂,相信后面的题目也能迎刃而解。

题目描述

n 个元素进栈序列为:1,2,3,4,...,n,则有多少种出栈序列。

思路

我们将进栈表示为 +1,出栈表示为 -1,则 1 3 2 的出栈序列可以表示为:+1 -1 +1 +1 -1 -1。

img

根据栈本身的特点,每次出栈的时候,必定之前有元素入栈,即对于每个 -1 前面都有一个 +1 相对应。因此,出栈序列的 所有前缀和 必然大于等于 0,并且 +1 的数量 等于 -1 的数量。

接下来让我们观察一下 n = 3 的一种出栈序列:+1 -1 -1 +1 -1 +1。序列前三项和小于 0,显然这是个非法的序列。

如果将 第一个 前缀和小于 0 的前缀,即前三项元素都进行取反,就会得到:-1 +1 +1 +1 -1 +1。此时有 3 + 1 个 +1 以及 3 - 1 个 -1。

因为这个小于 0 的前缀和必然是 -1,且 -1 比 +1 多一个,取反后,-1 比 +1 少一个,则 +1 变为 n + 1 个,且 -1 变为 n - 1 个。进一步推广,对于 n 元素的每种非法出栈序列,都会对应一个含有 n + 1 个 +1 以及 n - 1个 -1 的序列。

如何证明这两种序列是一一对应的?

假设非法序列为 A,对应的序列为 B。每个 A 只有一个"第一个前缀和小于 0 的前缀",所以每个 A 只能产生一个 B。而每个 B 想要还原到 A,就需要找到"第一个前缀和大于 0 的前缀",显然 B 也只能产生一个 A。

img

每个 B 都有 n + 1 个 +1 以及 n - 1 个 -1,因此 B 的数量为 [公式] ,相当于在长度为 2n 的序列中找到n + 1个位置存放 +1。相应的,非法序列的数量也就等于 [公式]

出栈序列的总数量共有 [公式] ,因此,合法的出栈序列的数量为 [公式]

此时我们就得到了卡特兰数的通项 [公式] ,至于具体如何计算结果将会在后面进行介绍。

2.2 括号序列

题目描述

n 对括号,则有多少种 “括号匹配” 的括号序列

img

思路

左括号看成 +1,右括号看成 -1,那么就和上题的进出栈一样,共有 [公式] 种序列。

Example

image-20220412202033167 image-20220412202906856

这里举个例子

c[1,1] = 0这里是因为:1≤k<1

image-20220412203138963

没有大于等于1又小于1的k所以这里是0

c[1,2]

image-20220412203800254

可以计算,这里1≤k<2,所以这里k可以取一个值1

image-20220412204114092

image-20220412205237499

image-20220412205806725

如何确定括号的序列?

首先先看右上角的那个数字,是3,我们确定了刚开始括起来的位置就是3这个地方。

image-20220412210026235

再看[1,3]的那个格子,是1,所以在1的地方加括号

image-20220412210637859

image-20220412210654425

这篇关于Matrix Chain Multiplication using Dynamic Programming Formula的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!