JDOJ 1090: 矩阵

JDOJ 1090: 矩阵

JDOJ传送门

Description

N(2<=N<=500)个矩阵相乘,求进行乘法的最少次数,我们认为两个矩阵A(mn)B(np)的乘法次数为mn*p次。

Input

第一行是整数N,接下来N行是对每个矩阵的描述,一行两个整数a,b,(1<=a,b<=50)a表示行,b表示列。输入确保能够相乘。

Output

一行输出最少乘法次数。

Sample Input

3 50 10 10 20 20 5

Sample Output

3500


题解:

和能量项链神似。

区间DP裸题

套模板即可。

不会的走这边:

浅谈区间DP

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=510;
int n;
int a[maxn],b[maxn];
int dp[maxn][maxn];//dp[i][j]表示从i到j的最大总能量
int main()
{
    scanf("%d",&n);
    memset(dp,0x3f,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        dp[i][i]=0;
    }
    for(int len=2;len<=n;len++)
        for(int i=1;i<=n-len+1;i++)
        {
            int j=i+len-1;
            for(int k=i;k<j;k++)
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+(a[i]*b[k]*b[j]));
        }
    printf("%d\n",dp[1][n]);
    return 0;
}
posted @ 2020-10-13 15:50  Seaway-Fu  阅读(114)  评论(0编辑  收藏  举报