矩阵链乘法(算法导论)
2014-03-26 19:18
435 查看
#include <iostream>
#include <stdio.h>
using namespace std;
int com[100][100];
///////////////////////////////////注意这段改进的乘法结合方式输出的实现
void combine(int i, int j)
{
if(i==j)
{
printf("M%d",i);
return;
}
if(i==j-1)
{
printf("M%d*M%d",i,j);
return;
}
if(i==com[i][j])
{
combine(i,com[i][j]);
printf("*");
}
else
{
printf("(");
combine(i,com[i][j]);
printf(")*");
}
if(j==com[i][j]+1)
{
combine(com[i][j]+1,j);
}
else
{
printf("(");
combine(com[i][j]+1,j);
printf(")");
}
}
int main(int argc, char* argv[])
{
int r[100], n, m[100][100]={0},s,t,k,j,i;
printf("How many matrixes?\n");
cin>>n;
printf("How size every matrix?\n");
for(i=1;i<=n+1;++i)
cin>>r[i];
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
com[i][j]=0;
m
=0;
for(i=1;i<n;++i)
{
m[i][i]=0;
m[i][i+1]=r[i]*r[i+1]*r[i+2];
com[i][i+1]=i;
}
for(s=2;s<=n-1;++s)
for(i=1;i<n-s+1;++i)
{
j=i+s;
m[i][j]=m[i+1][j]+r[i]*r[i+1]*r[j+1];
com[i][j]=i;
for(k=i+1;k<j;k=k+1)
{
t=m[i][k]+m[k+1][j]+r[i]*r[k+1]*r[j+1];
if(t<m[i][j])
{
m[i][j]=t;
com[i][j]=k;
}
}
}
printf("最后的计算策略:");
printf("\n组合方式:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",com[i][j]);
}
printf("\n最优乘法次数:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",m[i][j]);
}
printf("\n乘法次数共计:%6d\n",m[1]
);
printf("矩阵的结合方式:");
combine(1,n);
printf("\n\n");
return 1;
}
#include <stdio.h>
using namespace std;
int com[100][100];
///////////////////////////////////注意这段改进的乘法结合方式输出的实现
void combine(int i, int j)
{
if(i==j)
{
printf("M%d",i);
return;
}
if(i==j-1)
{
printf("M%d*M%d",i,j);
return;
}
if(i==com[i][j])
{
combine(i,com[i][j]);
printf("*");
}
else
{
printf("(");
combine(i,com[i][j]);
printf(")*");
}
if(j==com[i][j]+1)
{
combine(com[i][j]+1,j);
}
else
{
printf("(");
combine(com[i][j]+1,j);
printf(")");
}
}
int main(int argc, char* argv[])
{
int r[100], n, m[100][100]={0},s,t,k,j,i;
printf("How many matrixes?\n");
cin>>n;
printf("How size every matrix?\n");
for(i=1;i<=n+1;++i)
cin>>r[i];
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
com[i][j]=0;
m
=0;
for(i=1;i<n;++i)
{
m[i][i]=0;
m[i][i+1]=r[i]*r[i+1]*r[i+2];
com[i][i+1]=i;
}
for(s=2;s<=n-1;++s)
for(i=1;i<n-s+1;++i)
{
j=i+s;
m[i][j]=m[i+1][j]+r[i]*r[i+1]*r[j+1];
com[i][j]=i;
for(k=i+1;k<j;k=k+1)
{
t=m[i][k]+m[k+1][j]+r[i]*r[k+1]*r[j+1];
if(t<m[i][j])
{
m[i][j]=t;
com[i][j]=k;
}
}
}
printf("最后的计算策略:");
printf("\n组合方式:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",com[i][j]);
}
printf("\n最优乘法次数:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",m[i][j]);
}
printf("\n乘法次数共计:%6d\n",m[1]
);
printf("矩阵的结合方式:");
combine(1,n);
printf("\n\n");
return 1;
}
相关文章推荐
- C++虚拟多重继承对象模型讨论
- NYOJ_458小光棍数
- HDU 1698 Just a Hook(线段树:区间set,区间查询)
- C++虚拟多重继承对象模型讨论
- 黑马程序员-“hello world”小程序
- OC之Block的用法和实现委托
- BOM
- 围圈报数
- LeetCode | Rotate Image
- linux 64位系统下so编译
- 【python】__all__
- POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)
- java的集合框架
- 【python】__all__
- Matlab绘图-很详细,很全面
- C,C++,java,python四大语言横向对比
- Pow(x, n)
- C#扩展类的另一种方式:扩展方法
- 伊夫圣罗兰传_百度百科
- js的预解析