The DP gives minimum cost, but what's the optimal order? Track the split point. When computing dp[i][j], record split[i][j]=k where the minimum occurs.
Reconstruct recursively: parenthesize(i,j) = "(" + parenthesize(i,split[i][j]) + parenthesize(split[i][j]+1,j) + ")". For our example: split[1][3]=2, so optimal is (A1⋅A2)⋅A3. Store the split point in a separate array. Reconstruct by recursively printing the optimal parenthesization.