矩阵连乘问题(动态规划)

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))

猜你喜欢

转载自blog.csdn.net/abc1498880402/article/details/83041042