7006. 销售利润最大化.txt

UP 返回
https://leetcode.cn/problems/maximize-the-profit-as-the-salesman/description/

动态规划 

public int maximizeTheProfit(int n, List<List<Integer>> offers) {
        Map<Integer, List<int[]>> map = new HashMap<>();
        offers.forEach(list -> {
            if (!map.containsKey(list.get(1))) {
                List ll = new ArrayList();
                ll.add(new int[]{list.get(0), list.get(2)});
                map.put(list.get(1), ll);
            } else {
                map.get(list.get(1)).add(new int[]{list.get(0), list.get(2)});
            }
        });
        // 数组moneyArr表示下标不超过i的房子能卖的最大金额
        int[] moneyArr = new int[n + 1];
        // 第i个房子不卖,f[i]=f[i-1]
        // 第i个房子要卖,f[i]=MAX(f[i(start)]+money)
        // 优化表述为f[i+1]=...
        moneyArr[0] = 0;//下标不超过0的房子最多卖多少钱
        for (int i = 1; i < moneyArr.length; i++) {
            moneyArr[i] = moneyArr[i - 1];//1 不卖,钱和i-1一样
            // 2 卖
            if (map.containsKey(i - 1)) {
                // 取所有end为i的买家
                for (int[] arr : map.get(i - 1)) {
                    // 遍历买家,考察每一次买的钱的最大值。既然要买,那么获取对应买家的start为end的最大值,加上本次的金额,最终取最大值
                    // moneyArr[arr[0]] 取本次买家的start,获得以moneyArr[start]的值,再加上本次能卖的钱
                    moneyArr[i] = Math.max(moneyArr[i], moneyArr[arr[0]] + arr[1]);
                }
            }
        }
        return moneyArr[n];
    }
DOWN 返回