【计算机算法设计与分析】矩阵连乘问题(C++_DP)

问题描述

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10100,1005和550,采用(A1A2)A3,乘法次数为101005+10550=7500次,而采用A1(A2A3),乘法次数为100550+10100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次。

求解过程

在这里插入图片描述

Code

#include<bits/stdc++.h>
using namespace std;
int a[10]={30, 35, 15, 5, 10, 20, 25}, m[100][100], s[100][100], n=6;
int main()
{
    for(int k=1;k<=n-1;k++){//控制斜线
        for(int i=1;i<=(n-k);i++){//x轴
            int j=k+i;//y轴
            m[i][j]=0x3f3f3f;
            for(int z=j;z>i;z--){
                if(m[i][z-1]+m[z][j]+a[i-1]*a[z-1]*a[j]<m[i][j]){
                    m[i][j]=m[i][z-1]+m[z][j]+a[i-1]*a[z-1]*a[j];
                    s[i][j]=z-1;
                }
            }
        }
    }
    cout<<"最优解:"<<m[1][n]<<endl;
    cout<<"最少数乘次数矩阵:"<<endl;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<m[i][j]<<"\t";
        cout<<endl;
    }
    cout<<"------------------------------------------"<<endl;
    cout<<"最佳断开位置矩阵:"<<endl;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<s[i][j]<<"\t";
        cout<<endl;
    }
    getchar();
    return 0;
}
posted @ 2020-11-22 18:46  ccql  阅读(11)  评论(0编辑  收藏  举报  来源