package com.hhmstu.Algorithmdesignandanalysis.Dynamicprogramming; import java.util.Scanner; public class Matrix_Multiplication { public static void main(String[] args) { int a = 5; int p[] = {10, 5, 20, 25, 10, 6};//矩阵规模,pi-1表示矩阵Ai的行,pi表示Ai的列 int[][] m = new int[6][6]; int[][] s = new int[6][6]; int min = MM(a, p, m, s); System.out.println("该矩阵序列连乘问题的最优值是:" + min); for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { if (m[i][j] == 0) { System.out.print(m[i][j] + "\t\t"); } else { System.out.print(m[i][j] + "\t"); } if ((j + 1) % 6 == 0) { System.out.println(); } } } for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { System.out.print(s[i][j] + "\t"); if ((j + 1) % 6 == 0) { System.out.println(); } } } } public static int MM(int a, int[] p, int[][] m, int[][] s) { for (int i = 1; i <= a; i++) m[i][i] = 0;//初始化对角线 for (int r = 2; r <= a; r++)//r个矩阵相乘 for (int i = 1; i <= a - r + 1; i++) { int j = i + r - 1; m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[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; } } } return m[1][a]; } }
矩阵连乘与动态规划
最新推荐文章于 2024-07-23 11:46:27 发布