zoukankan      html  css  js  c++  java
  • 算法导论--矩阵链相乘

    #include<iostream>
    using namespace std;
    /*
    计算括号化方案数:标量乘法作为代价衡量,应该使标量乘法尽可能少。
    m[i,j]表示Ai.....Aj所需标量乘法的最小值。
    i=j 时只有一个矩阵,无需分割  m[i,i]=0;
    采用自底向上的方式:
    */
    int m[100][100];
    int p[]={30,35,15,5,10,20,25};
    int bottomcut(int n){
        int t;
        for(int l=2;l<=n;l++){
            for(int i=1;i<=n-l+1;i++){    //i<=n-l+1   防止后面的j超出n
                int j=i+l-1;
                m[i][j]=100000;
                for(int k=i;k<j;k++){
                    t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                        if(t<m[i][j])
                            m[i][j]=t;
                }
                
            }
        }
        return 0;
    }
    
    
    int main(){
        int n;
        while(cin>>n){
        memset(m,0,sizeof(m));
        bottomcut(n);
        cout<<m[1][n]<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cout<<m[i][j]<<" ";
            }
            cout<<endl;
         }
        }
        
        return 0;
    }

    加入打印信息

    #include<iostream>
    using namespace std;
    int m[100][100];
    int s[100][100];
    int p[]={3,2,5,10,2,3};
    int bottomcut(int n){
        int j,i,k,l,min;
        for( l=1;l<=n;l++){
            for(i=1;i<=n-l;i++){
                j=i+l;
                m[i][j]=10000;
                for(k=i;k<j;k++){
                    min=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                    if(m[i][j]>min){
                        m[i][j]=min;
                        s[i][j]=k;
                    }
            }
            }
        }
        return 0;
    }
    
    void Traceback(int i,int j){
        if(i==j)  return;
        Traceback(i,s[i][j]);
        Traceback(s[i][j]+1,j);
        cout<<"A["<<i<<":"<<s[i][j]<<"]"<<"乘以"<<"A:"<<(s[i][j]+1)<<"[:"<<j<<"]"<<endl;
    }
    int main(){
        int n;
        
        while(cin>>n){
        memset(m,0,sizeof(m));
        memset(s,0,sizeof(s));
        bottomcut(n);
        cout<<m[1][n]<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cout<<m[i][j]<<"   ";
            }
            cout<<endl;
         }
        Traceback(1,n);
        }
        
        return 0;
    }
  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/wintersong/p/4712741.html
Copyright © 2011-2022 走看看