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;
    }
  • 相关阅读:
    LeetCode 25 Reverse Nodes in k-Group
    圆桌派:家世背景对人的影响有多大
    BibTex 学习笔记
    R parallel包实现多线程1
    IIS学习笔记
    高效完成R代码
    圆桌派 :我们,朋友一生一起走
    高文欣个人简介
    R语言函数话学习笔记5
    git学习笔记1
  • 原文地址:https://www.cnblogs.com/wintersong/p/4712741.html
Copyright © 2011-2022 走看看