核心语句:ans=min(ans,d[i][k]+d[k+1][j]+m[i]*m[k+1]*m[j+1]);
其中m[i]*m[k+1]*m[j+1]可以类比普通求矩阵的代码
#include <stdio.h>
#include <string.h>
int m[1005];
int d[1005][1005];
int n;
int min(int a,int b)
{
return a<b?a:b;
}
int dp()
{
int len,i,j,k;
int ans;
memset(d,0,sizeof(d));
for (len=1;len<n;len++)//len+1表示一个括号内有几个矩阵(len = 1,代表矩阵链由两个矩阵构成 )
for (i=1,j=i+len;j<n;i++,j++)//i代表起点是第i个矩阵,j代表终点是第j个矩阵
{
ans=999999;
for (k=i;k<j;k++)//k代表是断点,求从第i个矩阵到第j个矩阵的最小值一定是求第i个矩阵到第k个矩阵的最小值,第k个矩阵最小值到第j个矩阵的最小值,再把这两个矩阵相乘(这是m数组所表示的代价)
ans=min(ans,d[i][k]+d[k+1][j]+m[i]*m[k+1]*m[j+1]);
d[i][j]=ans;
}
return d[1][n-1];
}
int main()
{
int i;//从1~n-1个矩阵
while(scanf("%d",&n)==1)
{
for (i=1;i<=n;i++)
scanf("%d",&m[i]);//比如3个矩阵,则n=4,第一个矩阵1行两列,第二个矩阵2行3列,第三个矩阵3行4列,则书写方式为1 2 3 4
printf("%d\n",dp());
}
return 0;
}
矩阵链乘(动态规划)
最新推荐文章于 2023-04-06 19:53:38 发布