1.C++实现:
#include<bits/stdc++.h> using namespace std; //int p[] = {30,35,15,5,10,20,25}; int p1[] = { 2,10,3,12,5,50,6}; void print(int s[][7], int i, int j){ if(i == j){ cout<<"A"<<i; } else{ cout<<"("; print(s, i, s[i][j]); print(s, s[i][j]+1, j); cout<<")"; } } void matrix_multiply(int p1[],int length){ int n = length - 1; int m[n+1][n+1]; int s[7][7]; for( int i = 1; i <= n; i++){ m[i][i] = 0; } for(int l = 2; l<= n; l++){ for(int i = 1; i <= n-l+1; i++){ int j = i+l-1; m[i][j] = 1e9; for(int k = i; k<=j-1; k++){ int q = m[i][k] + m[k+1][j] + p1[i-1]*p1[k]*p1[j]; if(q < m[i][j]){ m[i][j] = q; s[i][j] = k; } } } } print(s,1,n); cout<<endl; cout<<m[1][n]<<endl; } int main(){ matrix_multiply(p1, 7); return 0; }
2.java实现(自底向上):
public class 矩阵链乘法 { private static int p[] = {30,35,15,5,10,20,25}; private static int p1[] = { 2,10,3,12,5,50,6}; public static void main(String[] args) { // TODO Auto-generated method stub matrix_multiply(p); matrix_multiply(p1); } public static void print(int s[][], int i, int j){ if(i == j){ System.out.print("A"+i); } else{ System.out.print("("); print(s, i, s[i][j]); print(s, s[i][j]+1, j); System.out.print(")"); } } public static void matrix_multiply(int p[]){ int n = p.length - 1; int m[][] = new int[n+1][n+1]; int s[][] = new int[n+1][n+1]; for( int i = 1; i <= n; i++){ m[i][i] = 0; } for(int l = 2; l<= n; l++){ for(int i = 1; i <= n-l+1; i++){ int j = i+l-1; m[i][j] = (int) 1e9; for(int k = i; k<=j-1; k++){ int q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if(q < m[i][j]){ m[i][j] = q; s[i][j] = k; } } } } print(s,1,n); System.out.println(); System.out.println(m[1][n]); } }
3.自顶向下的纯递归:
public class 矩阵链乘法_纯递归 { private static int p[] = {30,35,15,5,10,20,25}; private static int p1[] = { 2,10,3,12,5,50,6}; public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(recursive_matrix_chain(p, 1, 6)); System.out.println(recursive_matrix_chain(p1, 1, 6)); } public static int recursive_matrix_chain(int []p, int i, int j) { int n = p.length; int m[][] = new int[n][n]; if(i == j) { return 0; } m[i][j] = (int) 1e9; for(int k = i; k<= j-1; k++) { int q = recursive_matrix_chain(p, i, k)+ recursive_matrix_chain(p, k+1, j)+ p[i-1]*p[k]*p[j]; if(q<m[i][j]) { m[i][j] = q; } } return m[i][j]; } }
4.备忘的自顶向下方法:public class 备忘的自顶向下递归 { private static int p[] = {30,35,15,5,10,20,25}; private static int p1[] = { 2,10,3,12,5,50,6}; public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(memoized_matrix_chian(p)); System.out.println(memoized_matrix_chian(p1)); } public static int memoized_matrix_chian(int p[]) { int n = p.length - 1; int m[][] = new int[n+1][n+1]; for(int i = 0; i<=n; i++) { for(int j = 0; j<=n; j++) { m[i][j] = (int) 1e9; } } return recursive_matrix_chain(p, m, 1, n); } public static int recursive_matrix_chain(int []p,int m[][], int i, int j) { if( m[i][j] < 1e9) { return m[i][j]; } if(i == j) { m[i][j] = 0; } else { for(int k = i; k<= j-1; k++) { int q = recursive_matrix_chain(p, m, i, k)+ recursive_matrix_chain(p, m, k+1, j)+ p[i-1]*p[k]*p[j]; if(q<m[i][j]) { m[i][j] = q; } } } return m[i][j]; } }