#include<iostream>
using namespace std;
const int MAX = 100;
int m[MAX][MAX], s[MAX][MAX];
int n;
int opt[MAX][MAX], path[MAX][MAX];
int p[MAX];
void matrixChain() {
for (int i = 1; i <= n; i++)
m[i][i] = 0;
for (int r = 2; r <= n; r++) //对角线循环
{
cout << r << endl;
for (int i = 1; i <= n - r + 1; i++) { //行循环
int j = r + i - 1; //列的控制
//找m[i][j]的最小值,先初始化一下,令k=i
m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];
s[i][j] = i;
//k从i+1到j-1循环找m[i][j]的最小值
for (int k = i + 1; 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位置处
//断开能得到最优解
s[i][j] = k;
}
}
}
}
}
void mc(){
for(int i=1; i<=n; i++){
}
}
//求从矩阵 start 到 矩阵 end 的最优乘法次数
int f(int start, int end) {
if (opt[start][end] != 0)
return opt[start][end];
if (start == end)
return 0;
if (start == end - 1) {
return opt[start][end] = p[start - 1] * p[start] * p[end];
}
int min = 1000000;
for (int i = start ; i < end; i++) {
int temp = f(start, i) + f(i+1, end) + p[start - 1] * p[i] * p[end] ;
if (min > temp) {
min = temp;
}
}
return opt[start][end] = min;
}
int main() {
cin >> n;
for (int i = 0; i <= n; i++)
cin >> p[i];
//测试数据可以设为六个矩阵分别为
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]
//则p[0-6]={30,35,15,5,10,20,25}
//输入:6 30 35 15 5 10 20 25
matrixChain();
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++){
opt[i][j] = 0;
m[i][j] = 0;
}
//使用递归的方法解决
cout << f(1, n) << endl;
//traceback(1,n);
//最终解值为m[1][n];
cout << m[1][n] << endl;
// for (int i = 0; i <= n; i++) {
// for (int j = 0; j <= n; j++) {
// cout << opt[i][j] << " ";
// }
// cout << endl;
// for (int j = 0; j <= n; j++) {
// cout << m[i][j] << " ";
// }
// cout << endl << endl;
// }
return 0;
}
分享到:
相关推荐
动态规划算法中矩阵连乘的实现代码,主要是用C语言编写;
主要介绍了Java矩阵连乘问题(动态规划)算法,结合实例形式分析了java实现矩阵连乘的算法原理与相关实现技巧,需要的朋友可以参考下
给定n个矩阵(A1,A2....An),其中Ai与Ai+1是可乘的,i=1,2,...,n-1.考察这n个矩阵的连乘积A1A2,...,An。 该资料为使用动态规划法解矩阵连乘积的最有计算次序问题,使用C++语言实现
算法设计与分析,使用动态规划法解决矩阵连乘问题。内有MatrixChain、TraceBack、RecurMatrixChain-递归解决矩阵连乘问题等程序,非常超值啊!
使用c#实现动态规划法——求解矩阵连乘问题,包括GUI和逻辑实现。
矩阵连乘问题分析和实现用于动态规划 最佳加括号方式-动态规划算法
动态规划思想的介绍(矩阵连乘问题,最长公共子序列,流水线作业调度问题,0-1背包问题)。算法课使用的ppt,可结合我的博客算法专栏一起看。有详细代码。
主要介绍了C语言矩阵连乘 (动态规划)详解的相关资料,需要的朋友可以参考下
动态规划+备忘录法 求最佳矩阵连乘
实现计算多个矩阵连乘的最终结果并且对时间复杂度进行了优化
在讲动态规划课时,我们知道可用动态规划算法求解的问题应具备的一个基本要素是子问题的重叠性质,矩阵连乘问题能用动态规划求解正是因为它具有重叠子问题。因此在解矩阵连乘问题的自顶向下的递归算法中,存在着大量...
如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 Input 输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试...
应用动态规划算法思想求解矩阵连乘的顺序问题。 【实验性质】 验证性实验(学时数:2H) 【实验要求】 应用动态规划算法的最优子结构性质和子问题重叠性质求解此问题。分析动态规划算法的基本思想,应用动态规划策略...
南邮动态规划法实验之矩阵连乘问题,使用了备忘录法以及动态规划法实现求解,代码注释详尽
matlab编写的 矩阵链乘的动态规划算法求解最少乘法次数,并且给出上三角矩阵和加矩阵乘法的加括号方式。 例:M1*…*M5=(M1(M2(M3(M4M5))))
矩阵连乘问题,求解连乘此数的最小次数,利用动态规划方法
算法设计与分析实验报告,python写的,附源码 问题描述:矩阵连乘算法实现; 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的...如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
动态规划问题,基本要素是最优子结构性质,子问题重叠性质,自底向上的求解方法。只要了解了基本要素,那么这种题型也会更好理解。本题有不少注释,便于读者阅读。
例如,用动态规划解决0-1背包问题、图像数据压缩、矩阵连乘、有向图最短路径、无交叉子集、元件折叠以及最长公共子序列等应用问题。另外,在语音识别领域,应用动态规划技术的动态时间伸缩算法DTW取得了很大成功,当...
Excel_求解矩阵公式讲解