DP基础_矩阵连乘
DP基础_矩阵连乘
Description
矩阵乘法是线性代数中最基础的一个知识点,设矩阵A为一个n行m列的矩阵,矩阵B为x行y列,那么A能乘B的条件为m = x,它们相乘将得出一个n行y列的矩阵,进行一次矩阵乘法的运算次数为n×m×y,现在给出k个矩阵,你每次可以合并相邻的两个矩阵,将它们做乘法得出的矩阵作为合并的结果,请问如何合并能使得总的运算次数最少。
Input
第一行一个数k(k≤100)。
接下来k行,每行两个正整数表示该矩阵的行和列(每个数≤50)。
Output
一个整数表示最少的合并代价。
Sample Input 1
3
1 5
5 20
20 1
Sample Output 1
105
思路:
基本区间dp板子,区间dp掌握--
代码:(有点小问题,题目要求是相邻的矩阵才可以合并,所以不需要复制一遍)
#include<bits/stdc++.h>
using namespace std;
struct node{
long long x,y;
}a[1020];
long long n,f[1020][1020];
int main()
{
memset(f,0x3f,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x >>a[i].y ;
a[i+n].x =a[i].x ;
a[i+n].y =a[i].y ;
}
for(int i=n;i>=1;i--) f[i][i]=0;
for(int l=2;l<=n;l++)
for(int i=1;i<=2*n-l+1;i++)
{
int j=i+l-1;
for(int k=i;k<j;k++)
{
if(a[k].y ==a[k+1].x )
{
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[i].x *a[k].y *a[j].y );
// if(f[i][j]>f[i][k]+f[k+1][j]+a[i].x *a[k].y *a[k].y)
// cout<<i<<" "<<j<<" "<<k<<'\n';
// cout<<f[i][j]<<" ";
}
}
}
long long ans=99999;
for(int i=1;i<=n;i++)
{
ans=min(f[1][i+n-1],ans);
}
cout<<ans<<'\n';
return 0;
return 0;
}