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]; //按照先序遍历输出 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; } //区间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); } }
备忘:日后详更思路。(最近真的时间不够用aaaa,forgive me.)