ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dp经典问题之矩阵连乘问题

2020-10-12 23:31:33  阅读:285  来源: 互联网

标签:连乘 矩阵 A1 A2 dp 乘法


dp经典问题之矩阵连乘问题

  • 问题描述

  • 思路分析

    1. 这个问题很明显可以用递归的思路的思考,先把连乘的矩阵分成两部分,分别递归地算出左边部分连乘需要的乘法次数和右边部分连乘需要乘法次数,最后计算两部分连乘的结果相乘的需要的乘法次数,求和得出需要的乘法总数。
    2. A1* A2*A3可以分成A1*A2 和A3两部分,树结构如下。当然也可以分成A1和A2*A3两部分,所以划分的时候需要确定从哪个地方划分,最后取乘法次数最小的那个划分。

因此可以写出递归方程


// Am*Am+1*Am+2……An 需要的最小乘法次数为f(m,n)
// 假设Am 中m表示矩阵的行为m,列为m+1
if(m==n){
   f(m,n) = 0
}

if(m > n){
   f(m,n) = f(m,k) + f(k+1, n) + m * (k+1) * (n + 1); //m * (k+1) * (n + 1) 为两部分相乘需要的乘法次数 Am……Ak 得到m行,k+1列。Ak+1……An得到k+1行,n+1列。所以需要m*(k+1)*(n+1)次乘法 
}
  • 继续思考, 这样的话,我直接利用递归就把这道题解决了, 还用dp?贴一下时间复杂度,好难推导啊!

  • 仔细思考不难发现,计算的时候很容易出现重复计算,A1*A2*A3*A4*A5 分成A1*A2*A3和A4*A5, 又可以分成A1*A2和A3*A4*A5, A1*A2明显存在重复利用。

  • 利用dp解决重复计算问题

    **我的思路是在自顶向下的时候利用一个全局的hashmap保存计算结果, 遇到重复的就从hashmap里面拿 **

    但是dp都是自低向上的,消除递归

  • 算法思路

    //1. 声明二维矩阵dp[n][n],dp[i][j]表示Ai……Aj需要的乘法次数
    //2. 声明矩阵s[n][n],s[i][j]用来表示Ai……Aj中的最优划分
    //3. 接下来初始化矩阵dp
    // 3.1 连乘的矩阵个数为1,即dp[i][j]中,i==j,令dp[i][j]==0
    // 3.2 连乘矩阵个数为2,计算dp[i][i+1],例如dp[1][2],dp[2][3]
    // 4. 连乘矩阵个数大于3,利用状态转移方程计算dp[i][j] = dp[i][k] + dp[k+1][j] + i *(k+1) * (j+1),填写相应的s矩阵
    // 5.利用s计算最佳计算顺序
    
    

标签:连乘,矩阵,A1,A2,dp,乘法
来源: https://www.cnblogs.com/jielearscoding/p/13806274.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有