转:https://blog.csdn.net/c18219227162/article/details/50412333
思考:这里为什么能够枚举最后的分割点,因为矩阵乘法的性质:如果
以A3为分割点那么不管A1-A3通过什么顺序乘,得到的矩阵一定是A1(行)*A3(列)
同理:A4-A6最后得到的一定是A4(行)*A6(列)
而且A3(列)一定等于A4(行)。
所以最后一次乘法的次数一定为:A1(行) * A3(列) * A6(列)
所以我们只保存列数就行了。特别的保存P(0)=A1(行)
区间dp中k为最后一次操作的分割线,那么这个贡献是可以计的,下一篇博客会体现这个性质。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n;
int P[105];
int dp[105][105];
int dfs()
{
for(int Len=2;Len<=n;Len++)
{
for(int L=1;L+Len-1<=n;L++)
{
int R=L+Len-1;
dp[L][R]=10000000;
for(int k=L;k<R;k++)
{
dp[L][R]=min(dp[L][R], dp[L][k]+dp[k+1][R]+P[L-1]*P[k]*P[R]);
}
}
}
return dp[1][n];
}
int main()
{
memset(dp, 0, sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x, y;
scanf("%d%d",&x,&y);
if(i==1)
{
P[0]=x;
}
P[i]=y;
}
cout<<dfs()<<endl;
return 0;
}