大家好,我是Peter,我又来啦🎈🎄✨
🎈🧨🎉《动态规划》专栏来啦,目前为止,此专栏已经有两篇文章啦🎁🎀🎄
1.DP概念与编程方法 DP概念和编程方法-CSDN博客
2.Peter算法小课堂—经典线性DP问题(上)Peter算法小课堂—经典线性DP问题(上)-CSDN博客
矩阵链乘法
背景知识
先了解背景知识(线性代数是大学学的,没学过线性代数的看看就过):
(1)矩阵乘法:如果矩阵A和矩阵B相乘,那么A的列数等于B行数。设A为m行n列,B为n行u 列,则AB为m行u列(m*u),矩阵乘法AB需要做mnu次乘法运算
(2)矩阵乘法的结合律:(AB)C=A(BC)。括号体现了计算顺序
(3)括号位置不同:矩阵乘法需要的乘法操作次数不同,以矩阵ABC举例
A为m*n,B为n*u,C为u*v
(AB)C,乘法次数为m*n*u+m*u*v
A(BC),乘法次数为m*n*v+n*u*v
两者的差为|m*n*(u-v)+u*v*(m-n)|,它可能是一个巨大的值。如果能知道那个括号方案最优,就能大大减少工作量。
下面给出矩阵链乘法的定义:给定一个数组p[],其中p[i-1]*p[i]表示矩阵Ai的尺寸,输出最少的乘法数。
例如p[]={40,20,30,10,30},它代表4个矩阵,尺寸分别为40*20、20*30、30*10、10*30。四个矩阵相乘,当括号方案为(A(BC))D,有最少次数26000
这是一个典型的区间DP。
算法思路
根据结合律,可以把它分成两个子区间[i,k]和[k+1,j],分别链乘。
然而,必定有一个k,使得乘法次数最少,那么,这个状态转移方程就解出来了
dp[i][j]=0 i=j
dp[i][j]=min{dp[i][k]+dp[k+1][j]+pi-1*pk*pj} i<=k<j
LIS
定义状态dp[i]表示第i个数为结尾的最长递增子序列,那么有
dp[i]=max{dp[j]}+1
LCS
(1) xi=yi dp[i][j]=dp[i-1][j-1]+1
(2) xi!=yi dp[i][j]=max(dp[i][j-1],dp[i-1][j])
🎈🎄✨希望大家能有所收获,有问题的话可以评论。🎈🎄✨