【问题描述】给定n个矩阵M1,M2...Mn,他们的维数分别是r1*c1,r2*c2...rn*cn,要求使用【动态规划】的策略求解矩阵连乘的最优计算代价(总乘法次数最少)。题目保证矩阵相乘一定是有效的。
例如有三个矩阵M1,M2,M3,他们的维度分别是2*10,10*2,2*10。按照矩阵乘法的结合律,可以先把M1和M2相乘,然后把结果和M3相乘,总的乘法次数为2*10*2+2*2*10=80次;也可以先把M2和M3相乘,再用M1去相乘,这种方式下总的乘法次数为10*2*10+2*10*10=400次。因此最优计算代价为80。
【输入形式】输入的第1行中有1个数字n,表示矩阵的个数;接下来n行,每行2个整数ri和ci,分别表示矩阵Mi的行数和列数。
【输出形式】输出1行中有一个数字,表示n个矩阵相乘的最优计算代价。
【样例输入】
3
2 10
10 2
2 10
【样例输出】
80
【说明】
n>=2
1<=ri,ci<=20
#include<bits/stdc++.h>
#define N 10000
using namespace std;
int c,n;
int s[N]={0},v[N]={0};
int dp[N][N];
int main()
{
cin>>c>>n;
for(int i=1;i<=n;i++) cin>>s[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
if(j>=s[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-s[i]]+v[i]);
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][c];
return 0;
}