一,问题分析
参考北航的算法设计,不到半小时就可以完美理解
问题上
算法设计与分析【北京航空航天大学】_哔哩哔哩_bilibili
问题下
算法设计与分析【北京航空航天大学】_哔哩哔哩_bilibili
二,代码部分
class solution{
//成员变量
int len;
int n;
int [][]D;
int [][]Rec;
String[] U={"","U1","U2","U3","U4","U5","U6"};
//动态规划成员方法
public int CM(int[] p){
//初始化
this.len=p.length;//这里len默认为矩阵个数n+1
this.n=len-1;
this.D=new int[len][len];//这里0位默认不使用,便于理解
this.Rec=new int[len][len];//回溯二维数组,后续使用
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
D[i][j]=999;//初始化无穷大
}
}
for(int i=1;i<=n;i++){
D[i][i]=0;
}
//动态规划
for(int l=2;l<=n;l++){
//l为横向区间长度从小到大
for(int i=1;i<=n-l+1;i++){
int j=i+l-1;
for(int k=i;k<=j-1;k++){
int q=D[i][k]+D[k+1][j]+p[i-1]*p[k]*p[j];
if(q<D[i][j]){
D[i][j]=q;
Rec[i][j]=k;
}
}
}
}
output(U,Rec,1,n);
System.out.println();
return D[1][n];
}
//回溯成员方法
public void output(String []U, int [][]Rec, int i, int j){
if (i==j){
System.out.print(U[i]);
return;
}
System.out.print("(");
output(U,Rec,i,Rec[i][j]);
System.out.print(")(");
output(U,Rec,Rec[i][j]+1,j);
System.out.print(")");
}
public void Table(){
for(int i=1;i<=this.n;i++){
for(int j=1;j<=this.n;j++){
System.out.print(this.D[i][j]+"\t");
}
System.out.println();
}
System.out.println();
for(int i=1;i<=this.n;i++){
for(int j=1;j<=this.n;j++){
System.out.print(this.Rec[i][j]+"\t");
}
System.out.println();
}
}
}
public class Matrix_Chain_Multiply {
public static void main(String[] args) {
int[] p={2,3,7,9,5,2,4};
solution func=new solution();
System.out.println("矩阵链乘所需标量乘法的最小次数为:"+func.CM(p));
System.out.println("动态规划表格为:");
func.Table();
}
}
三,注意点
1,矩阵输入的是矩阵的维数,比如{2,3,7,9,5},就是2行三列,3行7列,7行九列,9行5列的四个矩阵
2,动态规划的两个表格构建,较以往的动态规划表格有所不同,倒三角的自底向上的方式
3,暂时想不到了,后面再添加