矩阵链乘法(动态规划法)

来源:互联网 发布:linux tail f 编辑:程序博客网 时间:2024/06/11 19:41
/** * @fileDPMatrixChain.cpp * @briefa solution of MatrixChain with DP's way. * @author/Univtaoxiaoxiao/Univ. * @date11-3-2013 * @versionv1.0 *///实例:矩阵维数30X35 35X15 15X5 5X10 10X20 20X25#include <iostream>#include <vector>using namespace std;#define N 6#define INF 0x3f3f3f3fint m[N + 1][N + 1], s[N + 1][N + 1];void DPMatrixChain(vector<int> p){int n = p.size() - 1;int i, j, c, k;for (i = 1; i <= n; ++i)m[i][i] = 0;for (c = 2; c <= n; ++c){for (i = 1; i <= n - c + 1; ++i){j = i + c - 1;m[i][j] = INF;for (k = i; k <= j - 1; ++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 showpath(int i, int j){if (i == j)cout << "A" << i;else{cout << "(";showpath(i, s[i][j]);showpath(s[i][j] + 1, j);cout << ")";}}int main(){vector<int> p{ 30, 35, 15, 5, 10, 20, 25 };DPMatrixChain(p);cout << "最优加括号方式为:";showpath(1, 6);cout << endl;cout << "最小乘法次数:" << m[1][6] << endl;return 0;}

输出

 

0 0