程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 算法導論十五章--矩陣鏈乘法

算法導論十五章--矩陣鏈乘法

編輯:C++入門知識

具體分析見算法導論第十五章,代碼如下:
[cpp] 
#include<iostream> 
using namespace std; 
//p為矩陣鏈,p[0],p[1]代表第一個矩陣,p[1],p[2]代表第二個矩陣,length為p的長度 
//所以如果有六個矩陣,length=7,m為存儲最優結果的二維矩陣,t為存儲選擇最優結果路線的 
//二維矩陣 
void MatrixChainOrder(int *p,int (*m)[10],int (*t)[10],int length) 

    int n=length-1; 
    int i,j,k,q,num=0; 
    //A[i][i]只有一個矩陣,所以相乘次數為0,即m[i][i]=0; 
    for(i=1;i<length;i++) 
    { 
        m[i][i]=0; 
    } 
    //i代表矩陣鏈的長度,i=2表示有兩個矩陣相乘時如何劃分 
    for(i=2;i<=n;i++) 
    { 
        //j表示從第j個矩陣開始的i個矩陣如何劃分是最優 
        for(j=1;j<=n-i+1;j++) 
        { 
            //k為從第j個數i個矩陣就是k,從j到k表示他們之間的i個矩陣如何劃分 
            k=j+i-1; 
            //m[j][k]存儲了從j到k使用最佳劃分所得到的最優結果 
            m[j][k]=0x7fffffff; 
            //q為介於j到k-1之間的數,目的是利用q對j到k之間的矩陣進行試探性的劃分, 
            //從而找到最優劃分,這是一種遍歷性的試探。 
            for(q=j;q<=k-1;q++) 
            { 
                num=m[j][q]+m[q+1][k]+p[j-1]*p[q]*p[k]; 
                if(num<m[j][k]) 
                { 
                    m[j][k]=num; 
                    t[j][k]=q; 
                } 
            } 
        } 
    } 

void PrintAnswer(int(*t)[10],int i,int j) 

    if(i==j) 
    { 
        cout<<"A"<<i; 
    } 
    else 
    { 
        cout<<"("; 
        PrintAnswer(t,i,t[i][j]); 
        PrintAnswer(t,t[i][j]+1,j); 
        cout<<")"; 
    } 

int main() 
{ www.2cto.com
    int p[7]={30,35,15,5,10,20,25}; 
    int m[10][10],t[10][10]; 
    MatrixChainOrder(p,m,t,7); 
    PrintAnswer(t,1,6); 
    return 0; 

作者:liuzhanchen1987

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved