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;
}
posted @ 2021-02-22 21:16  yxr~  阅读(204)  评论(0编辑  收藏  举报