实验目的:
1) 掌握动态规划法的设计思想;
2)掌握动态规划法解题步骤;
3)学习运用动态规划法分析并解决矩阵连乘问题。
实验要求:运用动态规划法分析并解决下表给定要求的6个矩阵连乘问题
package 算法实验;
import java.util.Scanner;
public class Matrix {
public int [] matrixIndex=new int[100];
public int [][] decision = new int[100][100];//分割界限记录
public int [][]dp = new int[100][100];
int matrixNum = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Matrix matrix =new Matrix();
matrix.matrixNum=scanner.nextInt();
for (int i=0;i <= matrix.matrixNum;i++){
matrix.matrixIndex[i] = scanner.nextInt();
}
matrix.matrixChain();
System.out.println("括号划分:");
matrix.print(1,matrix.matrixNum);
System.out.println();
System.out.println("最小连乘次数dp表:");
for (int i=1;i<= matrix.matrixNum;i++){
for (int k=1;k<=i;k++){
System.out.print("null ");
}
for (int k=i+1;k<=matrix.matrixNum;k++)
System.out.print(matrix.dp[i][k]+" ");
System.out.println();
}
System.out.println("最小连乘次数:"+matrix.getMatrixResult());
}
public void matrixChain(){
for(int i=1;i<matrixNum;i++){//初始化对角线元素为零
dp[i][i]=0;
}
int j=0;
for(int length=2;length<=matrixNum;++length){//length表示矩阵连乘的矩阵数目
for (int i=1;i<=matrixNum-length+1;++i){
j=i+length-1;//length-1表示本次矩阵连乘的结果加和次数,j记录连乘矩阵的最后一个矩阵的下标
dp[i][j] = dp[i+1][j]+matrixIndex[i-1]*matrixIndex[i]*matrixIndex[j];//先将分割界限定在i,即最后计算第一个矩阵与后面整体相乘
decision[i][j] = i;//记录分割界限
for (int k = i + 1; k < j; ++k){
int tmp = dp[i][k]+dp[k+1][j]+matrixIndex[i-1]*matrixIndex[k]*matrixIndex[j];//k作为分割界限,不断寻找更优的划分界限,使得该规模矩阵相乘计算次数尽可能小
if(dp[i][j]>tmp){//如果有更优解就更新
dp[i][j] = tmp;
decision[i][j] = k;//更新分割界限
}
}
}
}
}
public void print(int i,int j){
if(i==j){
System.out.print("A["+i+"]");
return ;
}
System.out.print("(");
print(i,decision[i][j]);
print(decision[i][j]+1,j);
System.out.print(")");
}
public int getMatrixResult(){
return dp[1][matrixNum];
}
}
结果