Matrix Multiplication Chains

#include<iostream>
#include<cstdio>
using namespace std;

int r[8]= {1,5,10,3,12,5,50,6};
int c[8][8],kay[8][8];
int q=6;

void MatrixChain() {
    // Compute costs and kay for all Mij's.
// initialize c[i][i],c[i][i+1],and kay[i][i+1]
    for (int i = 1; i < q; i++) {
        c[i][i] = 0;
        c[i][i+1] = r[i]*r[i+1]*r[i+2];
        kay[i][i+1] = i;
    }
    c[q][q] = 0;
// compute remaining c's and kay's
    for (int s = 2; s < q; s++){
        for (int i = 1; i <= q - s; i++) {
// min term for k = i
            c[i][i+s] = c[i][i] + c[i+1][i+s]+ r[i]*r[i+1]*r[i+s+1];
            kay[i][i+s] = i;
// remaining mini terms
            for (int k = i+1; k < i + s; k++) {
                int t = c[i][k] + c[k+1][i+s]
                        + r[i]*r[k+1]*r[i+s+1];
                if (t < c[i][i+s]) {// smaller mini term
                    c[i][i+s] = t;
                    kay[i][i+s] = k;
                }
            }
        }
    }
}

void Traceback(int i, int j )
 {
 if (i == j) return;
 Traceback(i, kay[i][j]);
 Traceback(kay[i][j]+1, j);
 cout << "Multiply M " << i << ", " << kay[i][j];
 cout << " and M " << (kay[i][j]+1) << ", " << j<< endl;
}

int main() {

    MatrixChain();

    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            cout<<c[i][j]<<" ";
        }
        cout<<endl;
    }
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            cout<<kay[i][j]<<" ";
        }
        cout<<endl;
    }
    Traceback(1,6);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wcs_152/article/details/80341617
今日推荐