import java.util.Scanner; public class Main { static int[] value = new int[35]; static int[][] dp = new int[35][35]; static int[][] root = new int[35][35]; // Traverse the output in preorder static void dfs(int left, int right) { if (left <= right) { System.out.print(root[left][right] + " "); dfs(left, root[left][right] - 1); dfs(root[left][right] + 1, right); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { dp[i][j] = 1; } } for (int i = 1; i <= n; i++) { value[i] = sc.nextInt(); dp[i][i] = value[i]; root[i][i] = i; } //Interval dp for (int len = 1; len <n; len ++) { for (int i = 1; i <= n; i++) { int j = i + len; for (int k = i; k <= j; k++) { if (dp[i][k - 1] * dp[k + 1][j] + dp[k][k] > dp[i][j]) { dp[i][j] = dp[i][k - 1] * dp[k + 1][j] + dp[k][k]; root[i][j] = k; } } } } System.out.println(dp[1][n]); dfs(1, n); } }
Memo: More ideas in the future. (Really not enough time recently aaaa, forget me.)