#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 5
void Matrix_chain_order(int p[],int m[][N+1],int s[][N+1])
{
int i,l,j,k,tp;
for(i = 1;i <= N;i++)
m[i][i] = 0;
for(l = 2;l <= N;l++)
{
for(i = 1;i <= N-l+1;i++)
{
j = i + l -1;
m[i][j] = INT_MAX;
for(k = i;k <= j-1;k++)
{
tp = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if(tp < m[i][j])
{
m[i][j] = tp;
s[i][j] = k;
}
}
}
}
}
void print(int m[][N+1],int s[][N+1])
{
int i , j;
printf("================== m ================\n");
for(i = 1;i <= N;i++)
{
for(j = 1;j <= N;j++)
{
if(j >= i)
printf("%-10d ",m[i][j]);
}
printf("\n");
}
printf("================== s ===============\n");
for(i = 1;i <= N;i++)
{
for(j = 1;j <= N;j++)
{
if(j > i)
printf("%-10d ",s[i][j]);
}
printf("\n");
}
}
int main()
{
int p[N+1] = {5,10,12,5,50,6}; //length = n+1=6;
int m[N+1][N+1]; //m代表计算代价m[1...n,1...n]
int s[N+1][N+1]; //跟踪K s[1...n,1...n]
Matrix_chain_order(p,m,s);
print(m,s);
return 0;
}
矩阵链乘--动态规划15.2
最新推荐文章于 2021-12-20 19:37:37 发布