// wy.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <algorithm> #include <cmath> using namespace std; /************************************************************************/ //函数功能:递归输出最优的相乘方式 /************************************************************************/ void PrintOptimalSequence(int **LastChange, int i, int j) { if (i == j) printf("A%d", i); else { printf(" ("); PrintOptimalSequence(LastChange, i, LastChange[i][j]); PrintOptimalSequence(LastChange, LastChange[i][j] + 1, j); printf(") "); } } /************************************************************************/ //问题:有4个矩阵A1,A2,A3,A4。A1的维数=50*10,A2的维数=10*40,A3的维数=40*30,A4的维数=30*5 //函数功能:求矩阵连乘的最优相乘方式 //参数:seq中存放的是矩阵的列数和行数,即{ 50, 10, 40, 30, 5 };len表示数组的元素个数 //为了计算方便,二维数组M,lastChange的维数均从1开始 /************************************************************************/ int OptimalSequence(int seq[], int len) { int **M = new int *[len]; int **lastChange = new int*[len]; for(int i = 0; i < len; i++) { M[i] = new int[len](); lastChange[i] = new int[i](); } for(int left = 0; left < len; left++) M[left][left] = 0; for(int k = 1; k < len; k++) { for (int left = 1; left < len-k; left++) { //对每一个位置 int right = left + k; M[left][right] = INT_MAX; for (int i = left; i< right; i++) { int minValue = M[left][i] + M[i+1][right] + seq[left-1]*seq[i]*seq[right]; if(minValue < M[left][right]) { M[left][right] = minValue; lastChange[left][right] = i; } } } } //输出最优结合方式 PrintOptimalSequence(lastChange, 1, len - 1); cout<<endl; //返回最优解 return M[1][len-1]; } int _tmain(int argc, _TCHAR* argv[]) { int seq[] = { 50, 10, 40, 30, 5 }; int len = sizeof(seq) / sizeof(int); int res = OptimalSequence(seq, len); cout<<res<<endl; return 0; } 该算法的复杂度为:O(N*3)!