做矩阵相乘的前提是第一个矩阵的列必须和第二个矩阵的行相等。
结果的矩阵的dimension是2×2( first row × second column)
我做了2×3×2次乘法 first row ×(first column/second row)× second column
这个问题不关心内部是如何计算的,我只在乎为了计算他们我花费了多少次乘法运算。
卡特兰数:规定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·····················
通项公式为:
作者:力扣(LeetCode)
链接:https://zhuanlan.zhihu.com/p/976190852.1 进出栈序列
这是一道 最经典 的入门级卡特兰数题目,如果能把这题看懂,相信后面的题目也能迎刃而解。
题目描述
n 个元素进栈序列为:1,2,3,4,...,n,则有多少种出栈序列。
思路
我们将进栈表示为 +1,出栈表示为 -1,则 1 3 2 的出栈序列可以表示为:+1 -1 +1 +1 -1 -1。
根据栈本身的特点,每次出栈的时候,必定之前有元素入栈,即对于每个 -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。
每个 B 都有 n + 1 个 +1 以及 n - 1 个 -1,因此 B 的数量为 ,相当于在长度为 2n 的序列中找到
n + 1
个位置存放 +1。相应的,非法序列的数量也就等于 。出栈序列的总数量共有 ,因此,合法的出栈序列的数量为 。
此时我们就得到了卡特兰数的通项 ,至于具体如何计算结果将会在后面进行介绍。
2.2 括号序列
题目描述
n 对括号,则有多少种 “括号匹配” 的括号序列
思路
左括号看成 +1,右括号看成 -1,那么就和上题的进出栈一样,共有 种序列。
这里举个例子
c[1,1] = 0这里是因为:1≤k<1
没有大于等于1又小于1的k所以这里是0
c[1,2]
可以计算,这里1≤k<2,所以这里k可以取一个值1
如何确定括号的序列?
首先先看右上角的那个数字,是3,我们确定了刚开始括起来的位置就是3这个地方。
再看[1,3]的那个格子,是1,所以在1的地方加括号