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];
}
}