// 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
}