// DynamicProgram-MatrixParenthesized.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; #define random(x) (rand()%x) void MatrixChainOrder(int* plist,int** m,int** s, int num); int _tmain(int argc, _TCHAR* argv[]) { /* 1. 矩阵的个数n,则 Ai----An个矩阵 2. 构造每个矩阵的维数,Ai的维数为pi-1,pi,Ai+1的维数pi,pi+1. 为了保证矩阵能相乘, 这里的两个pi一定是相等。 所以n个矩阵只用构造一个 pi-1,pi,....pn的一个序列即可 3. 生成一个数组m[n,n]保存不同长度,pi到pj的矩阵相乘的代价 4. 生成一个数组s[n,n]保存取得m[i,j]最小值是的矩阵的划分位置 */ //1-10,共10个矩阵 int num = 10; cout << "请输入矩阵个数:" <<endl; cin >> num; //构造矩阵的维数 //矩阵下标 0-10 int* plist = new int[num+1]; //srand( (int)time( 0 ) ); for ( int x=0; x<=num; x++ ) { plist[x] = random(10)+1; cout << plist[x] << endl; } //m数组的[0][x],[x][0]都不使用 //写程序的时候便于表示 int** m = new int*[num+1]; int** s = new int*[num+1]; for(int i=0; i<=num; i++) { *(m+i) = new int[num+1]; *(s+i) = new int[num+1]; } for(int i=0; i<=num; i++) { for(int j=0; j<=num; j++) { m[i][j] = s[i][j] = 0; } } MatrixChainOrder(plist,m,s,num); cout << "计算完成 M 数组" << endl; for(int i=1; i<=num; i++) { for(int j=1; j<=num; j++) { if ( j<i ) { cout << i << "," << j << "/t" ; } else { cout << i << "," << j << "=" << m[i][j] << "/t" ; } } cout << endl; } cout << "计算完成 S 数组" << endl; for(int i=1; i<=num; i++) { for(int j=1; j<=num; j++) { if ( j<i ) { cout << i << "," << j << "/t" ; } else { cout << i << "," << j << "=" << s[i][j] << "/t" ; } } cout << endl; } //释放内存 for(int i=0; i<=num; i++) { delete[] m[i]; delete[] s[i]; } delete[] m; delete[] s; delete[] plist; system("pause"); return 0; } void MatrixChainOrder(int* plist,int** m,int** s, int num) { int n = num; //矩阵个数 for( int i=1; i<=n; 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] = -1; for( int k=i; k<=j-1; k++) { int q = m[i][k]+m[k+1][j]+ plist[i-1]*plist[k]*plist[j]; if ( m[i][j] == -1 ) { m[i][j] = q; s[i][j] = k; } else { if( q < m[i][j] ) { m[i][j] = q; s[i][j] = k; } } }//end for loop }//end for loop }//end for loop }