矩阵连乘问题——自底向上求解最优值,代码如下:
//矩阵连乘问题--自底向上求解最优值
//时间复杂度O(n3),空间复杂度O(n2)
#include <stdio.h>
#include <stdlib.h>
void MatrixChain(int *p, int n, int **m, int **s)
{
for (int i = 1; i <= n; i++)
m[i][i] = 0;
for (int r = 2; r <= n; r++)
{
for (int i = 1; i <= n - r + 1; i++)
{
int j = i + r - 1;
m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];
s[i][j] = i;
for (int k = i + 1; k < j; k++)
{
int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (t < m[i][j])
{
m[i][j] = t;
s[i][j] = k;
}
}
}
}
}
void printBreakPoints(int i, int j, int **s)
{
if (i == j)
{
printf("A%d", i);
}
else
{
printf("(");
printBreakPoints(i, s[i][j], s);
printBreakPoints(s[i][j] + 1, j, s);
printf(")");
}
}
int main()
{
int P[] = {30, 35, 15, 5, 10, 20, 25};
int n = sizeof(P) / sizeof(P[0]) - 1;
int **m = (int **)malloc((n + 1) * sizeof(int *));
int **s = (int **)malloc((n + 1) * sizeof(int *));
for (int i = 1; i <= n; i++)
{
m[i] = (int *)malloc((n + 1) * sizeof(int));
s[i] = (int *)malloc((n + 1) * sizeof(int));
}
MatrixChain(P, n, m, s);
printf("the min is:%d\n", m[1][n]);
printf("the points:");
printBreakPoints(1, n, s);
printf("\n");
for (int i = 1; i <= n; i++)
{
free(m[i]);
free(s[i]);
}
free(m);
free(s);
return 0;
}