import org.junit.Test; /** * @auther qwh * @create 2022-11-20-18:33 * 矩阵相乘还是就填两张表,然后根据表查看 */ public class test1_my { public void matricChain(int p[],int m[][],int s[][])//p表示矩阵的维数 m表示最佳乘积 s表示括号断开的位置 { int n=p.length-1;//n表示矩阵的个数(例如6个矩阵至少需要7个数表示) //m[][]表进行填表 for(int i=1;i<=n;i++) { m[i][i]=0;//m[i][i]表示一个矩阵无法相乘所以初始化为0 } for(int r=2;r<=n;r++)//斜着从第二行开始填表 { for(int i=1;i<=n-r+1;i++) { int j=i+r-1;//第一行的表 m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];//从第i行的第j个乘到最后一个 s[i][j]=i;//记录分割点(放括号的位置) for(int k=i+1;k<j;k++) //找做优的分割点 { int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];//递归公式 if(t<m[i][j])//如过满足新的分割点比之前的数据小就进行替换 { m[i][j]=t; s[i][j]=k; } } } } //最优解放在第一行最后一个表格里 System.out.println("最优解为"+m[1][n]); } public void traccback(int i,int j,int s[][])//i j表示连乘矩阵的下标 例如(i=1 j=4,表示A1A2A3A4)s表示分割点(即括号放的位置) { //递归出口 if(i==j) { System.out.print("A"+i); }else { System.out.print("("); //递归出左边的括号 traccback(i,s[i][j],s); //递归出右边的出口 traccback(s[i][j]+1,j,s); System.out.print(")"); } } @Test public void test() { int p[]=new int[]{30,35,15,5,10,20,25}; int m[][]=new int[7][7]; int s[][]=new int[7][7]; matricChain(p,m,s); traccback(1,6,s); } }