计算矩阵连乘积(动态规划)

时限:

1000ms 内存限制:10000K  总时限:3000ms

描述:

在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。计算C=AB总共需要p×q×r次乘法。 现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。 要求计算出这n个矩阵的连乘积A1A2…An最少需要多少次乘法。

输入:

输入数据的第一行是一个整数n(0 < n <= 10),表示矩阵的个数。 接下来的n行每行两个整数p,q( 0 < p,q < 100),分别表示一个矩阵的行数和列数。

输出:

输出一个整数:计算连乘积最少需要乘法的次数。

输入样例:

10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11

输出样例:

438

#include<stdio.h>
int n;//矩阵个数(0~10)
int p[11];//矩阵维数(n+1)
    
void Matrix_mult()
{
    int Arr[11][11],temp;//(a[0][0]不用)a[i][j]存放从矩阵i到矩阵j的最小矩阵乘法数
    int i,j,k;
    int d;//矩阵间隔d
    for(i=1;i<=n;i++)
            Arr[i][i]=0;//第i个矩阵到第i个矩阵乘法数为1
    for(d=1;d<=n-1;d++)//矩阵间隔r//矩阵链长度d+1
    {
        for(i=1;i<=n-d;i++)//i=1..~n-d
        {    j=i+d;//i~i+d构成长度为r+1的矩阵链
            Arr[i][j]=0+Arr[i+1][j]+p[i-1]*p[i]*p[j];//截断位置为i
            for(k=i+1;k<j;k++)//截断位置为k=i+1,i+2.....j-1
            {
                temp=Arr[i][k]+Arr[k+1][j]+p[i-1]*p[k]*p[j];
                if(temp<Arr[i][j])
                    Arr[i][j]=temp;//获得从矩阵i到矩阵j的最小矩阵乘法数
            }
        }
    }
    printf("%d\n",Arr[1][n]);//从第1个矩阵到第n个矩阵最小乘法数
}
int main()
{
    int i;
    scanf("%d",&n);//矩阵个数(0~10)    
    int b[10][2];
    for( i=0;i<n;i++)
    {    scanf("%d",&b[i][0]);//第i个矩阵的行数
        scanf("%d",&b[i][1]);//第i个矩阵的列数
    }
            
    for(i=0;i<n;i++)
        p[i]=b[i][0];//存放所有矩阵维数(测例中的1,2,3...10,11)
    p[n]=b[n-1][1];
    Matrix_mult();
    return 0;
}
原文地址:https://www.cnblogs.com/IThaitian/p/2586788.html