package 实验三;
public class 矩阵连乘问题 {
public static void main(String[] args) {
// TODO Auto-generated method stub
B b=new B();
b.run(); //计算
b.show1(); //输出计算次数
System.out.println();
b.show2(); //输出加括号位置的表
System.out.println();
b.print(0, 4); //输出怎么加括号
}
}
class B{
int [] a= {1,2,3,4,5}; //矩阵,相当于A1,A2,A3,A4,A5
int [] p= {30,35,15,5,20,25}; //记录连乘的数
int n=p.length-1; //矩阵个数
int [][] m=new int[n][n];
int [][] s=new int[n][n];
int i,j,r,k;
void run() {
DirectMatrixChain(n,p,m,s);
}
void DirectMatrixChain(int n,int p[],int m[][],int s[][]) {
for(i=0;i<n;i++) m[i][i]=0;
for(i=0;i<n;i++) s[i][i]=-1;
for(r=2;r<=n;r++) { //r为连乘矩阵的个数
for(i=0;i<n-r+1;i++){ //i表示连乘矩阵中的第一个
j=i+r-1; //j表示连乘矩阵中的最后一个
m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1];
s[i][j]=i;
for(k=i+1;k<j;k++) {
int t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(t<m[i][j]) {
m[i][j]=t;
s[i][j]=k;
}
}
}
}
}
void print(int i, int j)
{ //递归的方式来把最小乘数的表达式输出
if (i == j)
{
System.out.print(a[i]);
}
else
{
System.out.print("(");
print(i,s[i][j]);
print(s[i][j]+1,j);
System.out.print(")");
}
}
void show1(){
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
System.out.printf("%-6d",m[i][j]);
}
System.out.println();
}
}
void show2(){
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
System.out.printf("%-6d",s[i][j]);
}
System.out.println();
}
}
}
结果:
((1(23))(45))