一:动态规划算法与分治算法的区别

动态规划算法与分治算法的思想类似,都是通过将原问题分成一系列的子问题,并再求解每个子问题,将子问题合并的方式来解决问题。但是分治算法在解决子问题有重叠的问题时,会出现很多重复的不必要的计算。

分治算法适合解决子问题没有重叠的情况,分治算法将问题划分成互不相交的子问题,递归的求解子问题,再将它们组合起来,求出原问题的解。

而动态规划算法适合于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。顾在这种情况下,分治算法会做很多不必要的计算,他会反复的求解那些公共子问题。而动态规划算法对每个子问题只计算一次,将其解保存在一个表格中,从而无需每次求解一个个子子问题的时候都重新计算,从而可以避免这些重复的工作。[1]

DP算法的设计步奏:

1,刻画一个最优解的结构特征。

2,递归的定义最优解。

3,计算最优解的值,通常采用自底向上的方式。

4,利用计算出的信息构造最优解。[2]

通俗的讲,DP算法的步奏就是:

1,分析问题,找出问题是否能够用DP算法来解决,DP问题具有的两个特点:

a,最优子结构  如果一个问题的最优解包含子问题的最优解,我们就称此问题具有最优解结构性质。[3]

b,重叠子问题  问题的递归算法会反复的求解相同的子问题,而不是一直生成新的子问题,DP算法通常利用这个性质,将每个子问题求解一次,并将解存入一个      表中,当再次需要对这个子问题求解的时候,直接查表使用。[4]

2,,找出问题的递归求解方程

3,根据问题和递归方程,设计合适的数据结构来存放最有代价计算的子问题结果以及最有解的信息。

4,根据最优解的信息构造最有解计算方法。

二:矩阵连乘问题的DP算法解决方法

问题描述:设有n个矩阵相乘A1*A2*A3*A4*..........*An,计算矩阵的结合方式即怎么给矩阵加括号,来使矩阵连乘问题中所需要的计算次数最少。

故矩阵阶数下标为 p0*p1  p1*p2  p2*p3 ........  pi-1*pi  ........  pn-1*pn

用m[i,j]表示Ai*Ai+1*.........*Aj矩阵连乘的标量乘法的次数,p={p0,p1,p2,p3,..........,pn}表示矩阵阶数;

1,m[i,j]具有最优子结构性质,将矩阵连乘从k(i<=k<j)处断开,将原问题分成两个子问题m[i,k]和m[k+1,j]以及两个子问题相乘:

m[i,j] = m[i,k] + m[k+1 , j] + pi-1 * pk * pj ; 而两个子问题m[i,k]和m[k+1,j]又可以如此划分为最优子结构问题。

记当i=j时,m[i,i]=0; 即矩阵本身不需要标量乘法。

2,为简化问题,设有A1*A2*A3*A4  共4个矩阵连乘,其相乘过程中具有有限个重叠子问题

如下图中,m[1,4]的三种括号计算方法,每一种都会归结到m[1,1],m[2,2],m[3,3],m[4,4]这几个子问题的计算上来,故将该子问题计算结果存入表m中,每次计算的时候对其查表即可。

3,矩阵Ai*Ai+1*........*Aj的标量乘法次数根据断开的位置不同,就会有不同的计算结果,应取其中标量乘法次数最少的断开位置,并记录该位置。

递归方程为:

m[i,j] = 0  i=j

m[i,j] = min(i<=k<j){m[i,k] + m[k+1 , j] + pi-1 * pk * pj} i<j

根据上诉递归方程,计算最优子问题重用表m和最优子问题信息表s。可以使用二维数组来存放这两张表的信息。

计算表m与表s的伪代码:按照算法导论中给出

该过程计算表m时,按照对角线的方向填写表格m的信息,实现代码如下:

输入为连陈矩阵的下标阶数,输出返回最优化信息矩阵s

 /** @param p输入连乘矩阵的阶数 P0,P1,P2,P3.........Pn*/public static int[][] optMatrix(int[] p){int n=p.length;int[][] m = new int[n][n];int[][] s  = new int[n][n];for(int i=1;i<n;i++){m[i][i] = 0;for(int j=i+1;j<n;j++)m[i][j]=Integer.MAX_VALUE;}for(int l=2;l<n;l++){for(int i=1;i<n-l+1;i++){int j=i+l-1;for(int k=i;k<j;k++){int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];if(temp<m[i][j]){m[i][j]=temp;s[i][j] =k;}}}}return s;}
}

4,构造最优解,根据第三步计算的最优解信息矩阵s,构造最优解。

得到矩阵s之后,就可以递归的求解子问题,算法导论给出的伪代码为:

实现代码如下:

/** 根据最优化矩阵,构造输出序列* @param int[][] s 为最优化矩阵* @param i , j 分别为输入矩阵序列的序号,i<j,i为起始标号,j为终止标号*/public static void printOptParens(int[][] s,int i,int j){if(i<j){System.out.print("(");printOptParens(s, i, s[i][j]);printOptParens(s, s[i][j]+1, j);System.out.print(")");}else System.out.print("A"+i);}

学习过程中的笔记,有些地方可能会没那么详细。

[1],[2],[3],[4],出自算法导论第三版

dp算法求解矩阵连乘的问题相关推荐

  1. 如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量

    利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...

  2. 利用QR算法求解矩阵的特征值和特征向量

    利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...

  3. 使用绝热演化/量子退火算法求解矩阵本征态

    问题定义 定义一个\(N\times N\)大小的矩阵\(H\),找到该矩阵的本征态.已知:若态矢量\(\left|\psi\right>\)为哈密顿矩阵\(H\)的本征矢,则有: \[H\le ...

  4. 第十四周DP算法总结

    这周自己主要再看DP算法的博客,感觉DP这一部分内容确实比之前的都要麻烦一些,最后攻克这一部分难题还是挺好的. 这周自己总结了一些题型,以及一些方法思路,最后再把动态规划和之前的分治和贪心做一下比较. ...

  5. 动态规划算法python_动态规划——DP算法(Dynamic Programing)

    一.斐波那契数列(递归VS动态规划) 1.斐波那契数列--递归实现(python语言)--自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内 ...

  6. 动态规划DP算法理解

    1. DP算法定义: 每次决策依赖于当前状态,又随即引起状态的转移,多阶段最优化决策解决问题的过程就称为动态规划. 2. DP算法基本流程: 初始状态→│决策1│→│决策2│→-→│决策n│→结束状态 ...

  7. 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示

    HTML5提供了Canvas对象,为画图应用提供了便利. Javascript可执行于浏览器中, 而不须要安装特定的编译器: 基于HTML5和Javascript语言, 可随时编写应用, 为算法測试带 ...

  8. 强化学习(三)用动态规划(DP)求解

    在强化学习(二)马尔科夫决策过程(MDP)中,我们讨论了用马尔科夫假设来简化强化学习模型的复杂度,这一篇我们在马尔科夫假设和贝尔曼方程的基础上讨论使用动态规划(Dynamic Programming, ...

  9. pagerank算法实现matlab,Matlab 入门及PageRank算法求解.ppt

    Matlab 入门及PageRank算法求解 矩阵运算 + 矩阵加 - 矩阵减 * 矩阵乘 / 矩阵左除 \ 矩阵右除 ^ 矩阵幂 维数相同才能加减:方 阵才能求幂. 注意左乘,右乘. a\b?求a* ...

  10. matlab中服从高斯分布的矩阵_推荐基础算法之矩阵分解PMF

    推荐基础算法之矩阵分解PMF 大多数存在的协同过滤算法不能处理以下两种情况: 1. 不能处理大规模数据 2.不能处理评分非常少的用户数据 概率矩阵分解模型可以解决大规模.稀疏且不平衡的数据.这篇文章主 ...

最新文章

  1. 2 拖拽模型_3Dmax插件 | 螺丝钉、挖洞、网格模型等可以分分钟搞定
  2. 《Effective STL》学习笔记(第四部分)
  3. python科学计算_可视化图解Python科学计算包NumPy
  4. django 1.8 官方文档翻译: 3-2-3 TemplateResponse 和 SimpleTemplateResponse
  5. OpenShift 4 - 部署一个基于 Serverless 的 Banking 应用
  6. 想拿高工资?那些年Java面试官常问的知识点项目实战
  7. android:图片裁剪
  8. UVA960 Gaussian Primes【数学】
  9. 基于深度学习的2D和3D仿射变换配准
  10. [精简]托福核心词汇20
  11. AI综述专栏 | 多模态学习研究进展综述
  12. kubernetes部署kubesphere
  13. Springboot奶茶店点餐系统vtj89计算机毕业设计-课程设计-期末作业-毕设程序代做
  14. Sunday算法---简单高效的字符串匹配算法
  15. Python123第六章答案
  16. 二十九 我在软件园的那些日子里
  17. 离散数学——命题与逻辑
  18. 实际项目中的常见算法
  19. .NET桌面开发的一些思考
  20. 【NLP】2 Distributed Word Representation

热门文章

  1. 信鸽推送避免打开多个相同的activity
  2. 使用Python实现excel项目清单自动生成word文档
  3. 典型的对称加密和非对称加密算法有哪些
  4. 二分法求函数零点:(递归方法和非递归方法)
  5. leaflet地图鼠标移动画线
  6. vs2003无法打开sal.h
  7. 手风琴几排簧好_四排簧手风琴适合初学者么
  8. java mina 服务端_mina 框架java服务端的搭建和通信。
  9. 运营小技能:订阅号文章排版教程(添加图片超链接、推文采集、往期推荐)
  10. 图的遍历 (深度优先遍历和广度优先遍历)