矩阵连乘

关于矩阵连乘问题这两天上网搜了很多资料,以下三篇博客帮我弄明白了动态规划中的矩阵连乘问题, 
首先非常感谢三位博主,下面是三篇博客的地址,加上自己的一点补充。 
crystal_yi的博客:http://blog.sina.com.cn/s/blog_64018c250100s123.html### 
陈斌彬的技术博客:http://www.tuicool.com/articles/JfUjyib 
上面两位博主对此问题做了详细的讲解 
下面这位博主对此算法做了完整的实现 
Jason Damon:http://www.cnblogs.com/Jason-Damon 

以下的代码自己增加了一点点补充

 

void MatrixChain(int *p,int n,int **m,int **s) { //m是最优值,s是最优值的断开点的索引,n为题目所给的矩阵的个数(下面例子中) //矩阵段长度为1,则m[][]中对角线的值为0,表示只有一个矩阵,没有相乘的. for(int i = 1;i<=n;i++) m[i][i] = 0; //初始化单个矩阵连乘的最小次数,本题中n=6 for(int r = 2;r<=n;r++){//r表示矩阵的长度(2,3…逐渐变长) for(int i = 1;i<=n-r+1;i++){ //从第i个矩阵Ai开始,长度为r,则矩阵段为(Ai~Aj) int j = i+r-1;//当前矩阵段(Ai~Aj)的起始为Ai,尾为Aj //求(Ai~Aj)中最小的,其实k应该从i开始,但先记录第一个值,k从i+1开始,这样也可以。 //例如对(A2~A4),则i=2,j=4,下面一行先得出m[2][4]=m[3][4]+p[1]*p[2]*p[4],即A2(A3A4) m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j]; s[i][j] = i;//记录断开点的索引 <span style="white-space:pre">	</span>//以下for循环求出(Ai~Aj)中的最小数乘次数 for(int k = i+1 ; k<j;k++){ //例如对(A2~A4),则k=2,此处for循环计算(A2A3)A4 此次for循环不在包含 //A2(A3A4)因为上面已经得出m[2][4]=m[3][4]+p[1]*p[2]*p[4],即A2(A3A4) //将矩阵段(Ai~Aj)分成左右2部分(左m[i][k],右m[k+1][j]), 不包含A2(A3A4)再加上左右2部分最后相乘的次数(p[i-1] *p[k]*p[j]) 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; s[i][j] = k; //保存最小的断开位置,即最优的结果 }//if }//k }//i }//r }//MatrixChain


 

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法 动态规划 ,以便于您获取更多的相关知识。

 

原文链接:https://www.cnblogs.com/Jason-Damon/p/3231547.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值