动态规划——矩阵连乘问题

在计算矩阵连乘积时,加括号的方式对计算量有影响。

例如有三个矩阵A1,A2,A3连乘,它们的维数分别为 10*100,100*5,5*50。用第一种加括号方式(A1A2)A3计算,则所需数乘次数为10*100*5+10*5*50=7500。用第二种加括号方式A1(A2A3)计算,需要100*5*50+10*100*50=75000次数乘。

输入连乘矩阵的个数,每个矩阵的维数。要求输出最少数乘次数。

#include<stdio.h>
void perm(int *a,int n){
    int m[n][n];
    for(int i=0;i<=n;i++){
        m[i][i]=0;
    }
    for(int r=2;r<=n;r++){
        for(int i=1;i<=n-r+1;i++){
            int j=r+i-1;
            m[i][j]=m[i][i]+m[i+1][j]+a[i-1]*a[i]*a[j];
            for(int k=i+1;k<j;k++){
                int t=m[i][k]+m[k+1][j]+a[i-1]*a[k]*a[j];
                if(t<m[i][j]){
                    m[i][j]=t;
                }
            }
        } 
    }
    printf("%d",m[1][n-1]);
} 
int main(){
    int n;
    scanf("%d",&n);
    //这里b数组是输入的每一个矩阵的行列的,而a数组是记录不重复的矩阵的行列。
    //比如,输入30 35 35 15 15 5,那么a的值为30,35,15,5这样可以简化数组,每个数组的行列就是a[n],a[n+1] 
    int a[n+1],b[2*n];
    int j=0;
    for(int i=0;i<2*n;i++){
        scanf("%d",&b[i]);
        if(i%2==0){
            a[j]=b[i];
            j++;
        }
    } 
    a[n]=b[2*n-1];
    perm(a,n+1);
}

 

posted @ 2021-05-27 15:06  ....陈陈陈陈  阅读(344)  评论(0)    收藏  举报