动态规划-矩阵链乘法
2016-01-17 20:17
169 查看
矩阵链乘法问题:给定n个矩阵的链
m[i][j]表示矩阵链Ai…j所需标量乘法次数的最小值。
s[1..n-1][2..n]来记录最优m[i][j]对应的分割点k。
m[i][j]只依赖于那些少于j-i+1个矩阵的最优计算代价,算法应该按长度递增的顺序来求解矩阵链括号化问题。
<A1,A2...An>,矩阵Ai的规模为p[i-1]*p[i],求完全括号化方案,使得计算乘积A1A2…An所需标量乘法次数最少。
m[i][j]表示矩阵链Ai…j所需标量乘法次数的最小值。
m[i][j]=0(i=j) m[i][j]=m[i][k]+m[k+1][j]+p[i-1]p[k]p[j](i<=k<j,i<j)
s[1..n-1][2..n]来记录最优m[i][j]对应的分割点k。
m[i][j]只依赖于那些少于j-i+1个矩阵的最优计算代价,算法应该按长度递增的顺序来求解矩阵链括号化问题。
#include <iostream> using namespace std; void matrixChainOrder(int p[], int n, int m[][7],int s[][7]) { for (int i = 0; i < 7; i++) m[i][i] = 0; for (int l = 2; l <= n; l++) { for (int i = 1; i <= n - l + 1; i++) { int j = i + l - 1; //先让m[i][j]为int所能表示的最大值 m[i][j] = 0x7fffffff; for (int k = i; k < j; k++) { int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; if (q < m[i][j]) { m[i][j] = q; s[i][j] = k; } } } } } //将矩阵序列加括号打印出来 void print(int i, int j, int s[][7]) { if (i == j) cout << 'A'; else { cout << "("; print(i, s[i][j], s); print(s[i][j] + 1, j, s); cout << ")"; } } int main() { int p[7] = { 30,35,15,5,10,20,25 }; int n = 6; int m[7][7]; int s[7][7]; matrixChainOrder(p, n, m, s); print(1, 6, s); return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)