矩阵的链式相乘。。利用动归思想。将过程分为很多个子过程。从这些个子过程中找到最优解。对于两个矩阵的行列为m,n,l的。我们知道代价为m*n*l;我下边的代码充分体现了这个思想。并且附有关键步骤的详细解释。应用这个过程的关键是找到开始点,结束点,以及区间长度的应用。如果不懂还是仔细理解注释部分。
C++语言:
Codee#12822
#include <iostream>
#include <string>
using namespace std;
#define MAX 30000;
struct structMatrix
{
int value;
string str;
};
void MatrixMul( int * d , structMatrix * a , int n)
{
for( int i = 0; i <n; i ++)
{
a [ i *n + i ]. str = 'A' + char( i); //矩阵名称从A开始排
}
//动态规划解决问题
// for(i=1;i<n;i++)//主循环。。继初始化过程。。
for( int b = 1;b <n;b ++) //每个区间的区间长度
{
for( int i = 0; i <n -b; i ++) //开始的点i
{
int k1;
int j = i +b; //结束点。。其中b为区间长度
a [ i *n + j ]. value = MAX;
for( int k = i; k < j; k ++) //从开始点到结束点分别进行取值。。
{
int temp = a [ i *n + k ]. value + a [( k + 1) *n + j ]. value + d [ i ] * d [ k + 1 ] * d [ j + 1 ]; //两个乘积片段的代价之和,再加上组合在一起的代价
if( temp < a [ i *n + j ]. value) //子问题取小
{
a [ i *n + j ]. value = temp;
k1 = k;
} //找到最小的代价
}
a [ i *n + j ]. str = "(" + a [ i *n + k1 ]. str + a [( k1 + 1) *n + j ]. str + ")"; //标识括号位置
}
}
}
void main()
{
int n;
cout << "输入矩阵个数:" << endl;
cin >>n;
int * d = new int [n + 1 ];
structMatrix * a = new structMatrix [n *n ];
for( int i = 0; i <n; i ++)
for( int j = 0; j <n; j ++)
{
a [ i *n + j ]. value = 0;
}
cout << "输入矩阵行参数" << endl;
for( i = 0; i <n + 1; i ++)
{
cin >> d [ i ];
}
MatrixMul( d , a ,n);
cout << "最好加括号方式为" << endl;
cout << a [ 0 *n +n - 1 ]. str << endl;
cout << "花费的乘法的计算次数为:" << endl;
cout << a [ 0 *n +n - 1 ]. value << endl;
}
#include <string>
using namespace std;
#define MAX 30000;
struct structMatrix
{
int value;
string str;
};
void MatrixMul( int * d , structMatrix * a , int n)
{
for( int i = 0; i <n; i ++)
{
a [ i *n + i ]. str = 'A' + char( i); //矩阵名称从A开始排
}
//动态规划解决问题
// for(i=1;i<n;i++)//主循环。。继初始化过程。。
for( int b = 1;b <n;b ++) //每个区间的区间长度
{
for( int i = 0; i <n -b; i ++) //开始的点i
{
int k1;
int j = i +b; //结束点。。其中b为区间长度
a [ i *n + j ]. value = MAX;
for( int k = i; k < j; k ++) //从开始点到结束点分别进行取值。。
{
int temp = a [ i *n + k ]. value + a [( k + 1) *n + j ]. value + d [ i ] * d [ k + 1 ] * d [ j + 1 ]; //两个乘积片段的代价之和,再加上组合在一起的代价
if( temp < a [ i *n + j ]. value) //子问题取小
{
a [ i *n + j ]. value = temp;
k1 = k;
} //找到最小的代价
}
a [ i *n + j ]. str = "(" + a [ i *n + k1 ]. str + a [( k1 + 1) *n + j ]. str + ")"; //标识括号位置
}
}
}
void main()
{
int n;
cout << "输入矩阵个数:" << endl;
cin >>n;
int * d = new int [n + 1 ];
structMatrix * a = new structMatrix [n *n ];
for( int i = 0; i <n; i ++)
for( int j = 0; j <n; j ++)
{
a [ i *n + j ]. value = 0;
}
cout << "输入矩阵行参数" << endl;
for( i = 0; i <n + 1; i ++)
{
cin >> d [ i ];
}
MatrixMul( d , a ,n);
cout << "最好加括号方式为" << endl;
cout << a [ 0 *n +n - 1 ]. str << endl;
cout << "花费的乘法的计算次数为:" << endl;
cout << a [ 0 *n +n - 1 ]. value << endl;
}