动态规划-股票6

class Solution {
    public int maxProfit(int k, int[] prices) {
        if(k==0) return 0;
        int n = prices.length;
        if(k>prices.length/2) return profit(prices);
        int[][][] dp = new int[n][k+1][2];
        for(int i=0;i<n;i++){
            // base case
            dp[i][0][0] = 0;//至今为止没有交易,收益为0
            dp[i][0][1] = Integer.MIN_VALUE;//交易了0次,但持有股票,不符合规则
            for(int t =1;t<=k;t++){
                // base case
                if(i==0){
                    dp[i][t][0] = 0;//第一天买入t次,当天卖出t次,收入为0
                    dp[i][t][1] = -prices[i];//甭管第一天买多少次,反正最后少卖一次,持有了股票
                    continue;
                }
                dp[i][t][0] = Math.max(dp[i-1][t][0],dp[i-1][t][1]+prices[i]);
                dp[i][t][1] = Math.max(dp[i-1][t][1], dp[i-1][t-1][0]-prices[i]);
            }
        }
        return dp[n-1][k][0];
    }

    private int profit(int[] prices){
        int dp_i_0 = 0;
        int dp_i_1 = Integer.MIN_VALUE;
        int tmp = 0;
        for(int i =0;i<prices.length;i++){
            tmp = dp_i_0;
            dp_i_0 = Math.max(dp_i_0, dp_i_1 + prices[i]);
            dp_i_1 = Math.max(dp_i_1, tmp-prices[i]);
            tmp = dp_i_0;
        }
        return dp_i_0;
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:动态规划-股票6

文章字数:234

本文作者:梅罢葛

发布时间:2020-08-26, 21:30:22

最后更新:2020-08-22, 04:16:55

原始链接:https://qiurungeng.github.io/2020/08/26/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%82%A1%E7%A5%A86/
目录
×

喜欢就点赞,疼爱就打赏