题解 | #加分二叉树#

加分二叉树

http://www.nowcoder.com/practice/0196d17a175749178ca95aa40794dbb7

import java.util.*;

public class Main {
    static int[][][] dp = new int[32][32][2];
    static List<Integer> list = new ArrayList<>();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] val = new int[n + 1];
        for (int i = 1;  i <= n; ++i)
            val[i] = sc.nextInt();

        for (int i = 0; i < n; ++i) {
            for (int j = 1; j + i <= n; ++j) {
                int r = j + i;
                if (j == r) {
                    dp[j][r][0] = val[j];
                    dp[j][r][1] = j;
                }else {
                    for (int k = j; k <= r; ++k) {
                        int left = k == j ? 1 : dp[j][k - 1][0];
                        int right = k == r ? 1 : dp[k + 1][r][0];
                        int sum = left * right + val[k];
                        if (sum > dp[j][r][0]) {
                            dp[j][r][0] = sum;
                            dp[j][r][1] = k;
                        }
                    }
                }
            }
        }
        getPre(dp[1][n][1], 1, n);
        System.out.println(dp[1][n][0]);
        for (int i: list)
            System.out.print(i + " ");
    }
    private static void getPre(int cur, int l, int r) {
        if (l > cur || r < cur) return;
        list.add(cur);
        getPre(dp[l][cur - 1][1], l, cur - 1);
        getPre(dp[cur + 1][r][1], cur + 1, r);
    }
}

全部评论
l 1
点赞 回复 分享
发布于 2022-09-20 23:16 上海

相关推荐

评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务