动态规划之矩阵链乘法

来源:互联网 发布:查潮汐软件下载 编辑:程序博客网 时间:2024/06/09 17:14
#include <iostream> #include <stdio.h>#include <assert.h>#include <stdlib.h>#include <String.h>#define MAX 100typedef struct Matrix{    int left;    int right;}Matrix;using namespace std;//自底向上的矩阵链乘法 void MATRIX_CHAIN_ORDER(Matrix a[], int num){    //创建存储最优子问题解的数组     int m[MAX][MAX], s[MAX][MAX];    //数组初始化     memset(m, MAX*MAX, sizeof(int));    memset(s, MAX*MAX, sizeof(int));    for(int i=0; i<num; i++)        m[i][i] = 0;    for(int l=2; l<=num; l++){        for(int i=0; i<num-1; i++){            //依次计算计算链长为l的最小矩阵乘积             int j = i+l-1;            m[i][j] = 2e31;            for(int k=i; k<=j-1; k++){                int i_j_sum = m[i][k]+m[k+1][j]+a[i].left*a[k].right*a[j].right;                if(i_j_sum<m[i][j]){                    m[i][j] = i_j_sum;                    s[i][j] = k;                }            }         }        for(int i=0; i<num; i++){            for(int j=0; j<num; j++){                cout <<m[i][j]<<" ";            }            cout<<endl;        }    }    cout<<m[0][num-1];    return;}int LOOKUP_CHAIN(int m[][MAX], Matrix a[], int i, int j){    if(i == j){        m[i][j]=0;    }    for(int k=i; k<j; k++){        int q = LOOKUP_CHAIN(m, a, i, k)+LOOKUP_CHAIN(m, a, k+1, j) + a[i].left*a[k].right*a[j].right;        if(q<m[i][j]){            m[i][j] = q;        }    }    return m[i][j];} //自顶向下的矩阵链乘法 void MEMOIZED_MATRIX_CHAIN(Matrix a[], int num){    //创建存储最优子问题解的数组     int m[MAX][MAX], s[MAX][MAX];    //数组初始化     memset(m, MAX*MAX, sizeof(int));    memset(s, MAX*MAX, sizeof(int));    for(int i=0; i<num; i++){        for(int j=i; j<num; j++){            m[i][j] = 2e31;        }    }    //递归计算    LOOKUP_CHAIN(m, a, 0, num-1);    cout<<m[0][num-1];    return;}int main(){    Matrix a[MAX];    int num = -1;    while(cin>>num){        //输入矩阵参数         for(int i=0; i<num; i++)            cin>>a[i].left>>a[i].right;        //  MATRIX_CHAIN_ORDER(a, num);        MEMOIZED_MATRIX_CHAIN(a, num);    }    return 0; }
0 0
原创粉丝点击