矩阵乘法(区间DP)

题目描述:一个A x B的矩阵乘以一个B x C的矩阵将得到一个A x C的矩阵,时间复杂度为A x B x C,按顺序给出n个矩阵的大小。求计算出它们的乘积的最少需要花费多少时间。


样例输入:

3

10 100

100 5

5 50
样例输出:

7500

 由于矩阵乘机的顺序不同会影响结果,n<=100,所以可以用区间DP来做。

代码:

#include <bits/stdc++.h>
#define N 1001
#define ll long long
using namespace std;
ll f[N][N];int a[N],b[N],n;
ll time(int x,int y,int z,int w){
    return x*y*w;
}
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            f[i][j]=100000000;
    for (int i=1;i<=n;i++) f[i][i]=0;
    for (int i=1;i<=n;i++)
        for (int j=1;i+j<=n;j++)
            for (int k=0;k<i;k++)
                f[j][i+j]=min(f[j][i+j],f[j][j+k]+f[j+k+1][i+j]+time(a[j],b[j+k],a[j+k+1],b[i+j]));
    printf("%lld",f[1][n]);
}

猜你喜欢

转载自www.cnblogs.com/Yun-17/p/9562388.html
今日推荐