您的位置:首页 > 其它

动态规划应用之--矩阵的链式相乘

2010-08-14 19:39 176 查看
矩阵的链式相乘。。利用动归思想。将过程分为很多个子过程。从这些个子过程中找到最优解。对于两个矩阵的行列为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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: