矩阵连乘问题
- 在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52HGaeO4-1639391368981)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)]
给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An,最少的乘法次数。
递归公式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3MtHQbPl-1639391368985)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif)]
public class Matrix_multiplication {// 矩阵连乘 动态规划
public static void main(String args[]){
int []arr = {30,35,15,5,10,20,25};
int [][]dp = new int[7][7];//存放字符位置 i--j 最优分割位置
MatrixChain(6,dp,arr);
System.out.println("最佳添加括号的方式为:");
print(1,6,dp);
}
static int [][]MatrixChain(int N,int dp[][],int []arr){
int i,j,k,r;
int [][] minNum = new int[N + 1][N + 1];
for(i = 0;i <= N;i++){//初始化对角线,单个矩阵相乘为0
minNum[i][i] = 0;
}
for(r = 2;r <= N;r++){//r个矩阵连乘 规格为r
for(i = 1;i <= N - r + 1;i++){//保证i,j均不超过N,且可以分为子问题
j = i + r - 1;//i --i (i + 1) -- j
minNum[i][j] = minNum[i][i] + minNum[i + 1][j] + arr[i - 1] * arr[i] * arr[j];//划分第一个括号
dp[i][j] = i;//假设从i到j分割第i个位置更好
for(k = i + 1;k < j;k++){//尝试划分其它括号 i--k (k + 1) -- j
int temp = minNum[i][k] + minNum[k + 1][j] + arr[i - 1] * arr[k] * arr[j];
if(temp < minNum[i][j]){//当其它组合的乘积更小的时候
minNum[i][j] = temp;
dp[i][j] = k;
}
}
}
}
System.out.println("最小计算量的值为:" + minNum[1][N]);
return dp;
}
static void print(int i,int j,int [][]dp){//dp[i][j]中存的是从i到j最适合分割拆分的位置
if(i == j){//
System.out.print("A[" + i + "]");
return;
}
System.out.print("(");
print(i,dp[i][j],dp);
print(dp[i][j] + 1,j,dp);
System.out.print(")");
}
}
参考博客:
https://blog.csdn.net/weixin_44952817/article/details/110124596?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163937903916780274145649%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163937903916780274145649&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-110124596.pc_search_result_cache&utm_term=%E7%9F%A9%E9%98%B5%E8%BF%9E%E4%B9%98+%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92&spm=1018.2226.3001.4187