The key to making DP easier is the output path ....
# Include <cstdlib> # include <cstdio> # include <cstring> # define INF 0x7fffffffusing namespace STD; int N; struct CC {int A; int B; void F (INT X, int y) {A = x; B = y ;}}; CC M [105]; int DP [105] [105]; int path [105] [105]; int dp (int l, int R) {If (DP [l] [r]! = 0) return DP [l] [r]; If (L + 1 = r) {DP [l] [r] = m [l]. A * m [l]. B * m [R]. b; return DP [l] [r];} If (L = r) return 0; int mins = inf; For (INT I = L; I <R; I ++) {int T = dp (L, I) + dp (I + 1, R) + M [l]. A * m [I]. B * m [R]. b; If (T <mins) {mins = T; path [l] [r] = I ;}} DP [l] [r] = mins; return mins ;} void print (int l, int R) {If (L = r) {printf ("A % d", R); return ;} if (L + 1 = r) {printf ("(a % d x a % d)", l, R); return;} printf ("("); print (L, path [l] [r]); printf ("X"); print (path [l] [r] + 1, R); printf (") ");} int main () {int CA = 1; while (scanf (" % d ", & n) = 1 & N) {for (INT I = 1; I <= N; I ++) {int X, Y; scanf ("% d", & X, & Y ); M [I]. f (x, y);} memset (DP, 0, sizeof (DP); memset (path, 0, sizeof (PATH); DP (1, N ); printf ("case % d:", CA ++); print (1, N); puts ("") ;}return 0 ;}