LeetCode 188. Best Time to Buy and Sell Stock IV(只能進行 k 次的股票交易)

最多可以完成 k 筆交易

public int maxProfit(int k, int[] prices) {
        //三維DP動態規劃。三個維度,第一維表示天,第二維表示交易了幾次,第三維表示是否持有股票
        if(prices == null) return 0;
        int len = prices.length;
        if(len == 0) return 0;

        //當k大於等於數組長度一半時, 問題退化爲貪心問題
        if(k >= len / 2) {
            return k_inf(prices);
        }

        int[][][] dp = new int[len][k + 1][2];
        for(int i = 0; i < len; i ++) {
            for(int j = k; j > 0; j --) {
                if(i == 0) {
                    dp[0][j][0] = 0;
                    dp[0][j][1] =- prices[0];
                    continue;
                }
                dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
                dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]);
            }
        }
        return dp[len - 1][k][0];
    }

    //貪心
    public int k_inf(int[] prices) {
        int res = 0;
        for(int i = 1; i < prices.length; i ++) {
            if(prices[i] > prices[i - 1]) {
                res += prices[i] - prices[i - 1];
            }
        }
        return res;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章