NYOJ 1409 快速计算【矩阵连乘】

本文探讨了矩阵连乘问题中如何通过最优加括号策略来减少计算次数,提供了求解最小乘法次数的算法及实例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

给定n个矩阵{A1,A2A3,…,An},其中,Ai 和Ai+1(i=1,2,…,n−1)是可乘的。矩阵乘法如图4-40所示。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的计算量最小。

例如:

A1是M5×10的矩阵;

A2是M10×100的矩阵;

A3是M100×2的矩阵。

那么有两种加括号的方法:

(1)(A1 A2)A3;

(2)A1(A2 A3)。

第1种加括号方法运算量:5×10×100+5×100×2=6000。

第2种加括号方法运算量:10×100×2+5×10×2=2100。

不同的加括号办法,矩阵乘法的运算次数可能有巨大的差别!

输入描述:

第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(0<n<100)表示矩阵的个数。
第2行共n+1个整数pi((0<pi<100)),是每个矩阵的行数和最后一个矩阵的列数。</span>

输出描述:

对于每一组输入,输出矩阵连乘的最少乘法次数。
每组的输出占一行。</span>

样例输入:

复制

2
5
3 5 10 8 2 4
8
4 8 12 7 9 30 4 65 52

样例输出:

314
16516

题解:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];
int k, m, n;
int p[maxn];

int main()
{
    cin >> m;
    while(m--) {
        cin >> n;
        for(int i = 0; i <= n; i++)
            cin >> p[i];
        memset(dp, 0, sizeof dp);
        for(int x = 2; x <= n; x++) {
            for(int i = 1; i <= n-x+1; i++) {
                int j = i+x-1;
                dp[i][j] = dp[i+1][j] + p[i-1]*p[i]*p[j];
                for(int l = i; l < j; l++) {
                    dp[i][j] = min(dp[i][l]+dp[l+1][j]+p[i-1]*p[l]*p[j], dp[i][j]);
                }
            }
        }
        cout << dp[1][n] <<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值