矩阵链乘法

来源:互联网 发布:京东杜爽离职知乎 编辑:程序博客网 时间:2024/06/05 06:58
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 stubmatrix_multiply(p);matrix_multiply(p1);}publicstatic 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(")");}}publicstatic 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 stubSystem.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 stubSystem.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];}}


 
原创粉丝点击