#include<stdio.h>
#include<string.h>
#define MaxNum 100
void MatrixChain(int p[MaxNum], int n, int m[MaxNum][MaxNum], int s[MaxNum][MaxNum]);
void traceback(int i, int j, int s[MaxNum][MaxNum]);
int main()
{
int P[MaxNum];
int N;
int r;
int M[MaxNum][MaxNum];
int S[MaxNum][MaxNum];
scanf_s("%d", &N);
for (r = 0; r <= N; r++)
{
scanf_s("%d", &P[r]);
}
MatrixChain(P, N, M, S);
traceback(1, N, S);
return 0;
}
void MatrixChain(int p[MaxNum], int n, int m[MaxNum][MaxNum], int s[MaxNum][MaxNum])
{
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 traceback(int i, int j, int s[MaxNum][MaxNum])
{
if (i == j)
printf("A%d", i);
else if (i == j - 1)
printf("(A%dA%d)", i, j);
else
{
printf("(");
traceback(i, s[i][j], s);
traceback(s[i][j] + 1, j, s);
printf(")");
}
}
02-22
1428
06-30
7万+
10-01
893