1 #include <iostream>
2 #include <bits/stdc++.h>
3 using namespace std;
4 int a[20],flag[20][20],s[20][20];
5 void dfs(int l,int r)
6 {
7 if(l==r)
8 {
9 printf("%d",l);
10 return ;
11 }
12 printf("<");
13 dfs(l,s[l][r]);
14 printf(",");
15 dfs(s[l][r]+1,r);
16 printf(">");
17 }
18 int main()
19 {
20 int n;
21 while(~scanf("%d",&n))
22 {
23 for(int i=0; i<=n; i++)
24 scanf("%d",&a[i]);
25 memset(flag,0,sizeof(flag));
26
27 for(int i=1; i<n; i++)
28 {
29 for(int j=1; j+i<=n; j++)
30 {
31 flag[j][i+j]=flag[j+1][i+j]+a[j-1]*a[j]*a[i+j];
32 s[j][i+j]=j;
33 for(int k=j+1; k<i+j; k++)
34 {
35 if(flag[j][i+j]>flag[j][k]+flag[k+1][i+j]+a[j-1]*a[k]*a[i+j])
36 {
37 flag[j][i+j]=flag[j][k]+flag[k+1][i+j]+a[j-1]*a[k]*a[i+j];
38 s[j][i+j]=k;
39 }
40 }
41 }
42 }
43 printf("这%d个矩阵的完全加括号以后最少的计算次数是%d\n",n,flag[1][n]);
44 printf("这%d个矩阵的完全加括号的方式为:",n);
45 dfs(1,n);
46 printf("\n");
47 }
48 return 0;
49 }