动态规划应用之--矩阵的链式相乘
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;
}
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;
}
相关文章推荐
- 矩阵相乘最优顺序---动态规划
- [NOIP2003]加分二叉树 --动态规划-类似矩阵相乘
- c++中矩阵相乘(对象数组与对象指针的应用)
- 矩阵的应用--矩阵相乘与矩阵快速幂
- C语言动态数组在矩阵相乘中的应用
- 第九周 项目2 对称矩阵压缩存储的实现与应用(相加、相乘)
- c 动态规划 矩阵相乘
- Mapreduce 矩阵相乘应用--计算文本间的相似度
- 动态规划之矩阵链相乘
- Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比
- 第八周 【项目4-稀疏矩阵的三元组表示的实现及应用(2)】
- 理解矩阵相乘
- java 矩阵相乘
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵乘法(两个矩阵相乘)
- 分块矩阵在秩不等式中的应用
- caioj·1075: 动态规划入门(中链式2:能量项链)
- 两个二维矩阵相乘的算法
- 矩阵奇异值分解及其应用
- codeforces 514E E. Darth Vader and Tree(矩阵应用)