Day 51|309.最佳买卖股票时机含冷冻期 | 714.买卖股票的最佳时机含手续费

● 309.最佳买卖股票时机含冷冻期

/*
第5-6行:初始化dp数组。
dp[0]表示持有股票时的最大利润,因此初始化为-prices[0];
dp[1]表示不持有股票,并且不处于冷冻期,因此初始化为0。
第7行:使用for循环遍历prices数组。循环控制变量i表示当前遍历的价格的下标。
第8行:使用临时变量temp和temp1来保存dp[0]和dp[2]的值,因为后续dp[0]和dp[2]的值会改变。
第9-11行:根据状态转移方程更新dp数组。dp[0]表示持有股票时的最大利润,可以从前一天持有股票的最大利润dp[0]、前一天不持有股票且不处于冷冻期的最大利润dp[1]、或者前一天处于冷冻期的最大利润dp[3]与前一天的股价prices[i-1]相减得到。
第12行:dp[1]表示不持有股票且不处于冷冻期时的最大利润,可以从前一天不持有股票且不处于冷冻期的最大利润dp[1]和前一天处于冷冻期的最大利润dp[3]中取最大值得到。
第13行:dp[2]表示不持有股票且处于冷冻期时的最大利润。可以从前一天持有股票且今天卖出获得的最大利润dp[0]和前一天不处于冷冻期的最大利润dp[1]中取最大值,并加上今天的股价prices[i-1]得到。
第14行:dp[3]表示处于冷冻期时的最大利润,可以从前一天不持有股票且处于冷冻期的最大利润dp[3]和前一天持有股票今天卖出获得的最大利润dp[2]中取最大值得到。
第16行:返回dp数组中三个元素的最大值,即为题目所求的最大利润。*/
class Solution {
    public int maxProfit(int[] prices) {
     int[] dp =new int[4];
​
     dp[0] = -prices[0];//dp[0]表示持有股票时的最大利润
     dp[1] = 0;//表示不持有股票并且不处于冷冻期
     for(int i =1;i<=prices.length;i++){
         int temp = dp[0];
         int temp1 = dp[2];
         dp[0] =Math.max(dp[0],Math.max(dp[3],dp[1]) - prices[i-1]);//持有股票的最大利润
         dp[1] = Math.max(dp[1],dp[3]);//前一天不持有股票并且不处于冷冻期的最大利润
         dp[2] = temp + prices[i-1];//不持有股票并且处于冷冻期的最大利润
         dp[3] = temp1; //表示处于冷冻期的最大利润
     }
     return  Math.max(dp[3],Math.max(dp[1],dp[2])); 
     }  
}
​

我真的感觉完全理解不了,然后我又去听了一遍,我一直以为chatGpt的解释是很正确的,没错,他是正确的,只是你理解不了他什么意思

所以我要改成自己的意思

/*
dp[0]:持股
dp[1]:保持卖出股,冷冻期之后到买入一张股票的时间段
dp[2]:卖出股
dp[3]:冷冻期
dp[0]:
由股票没有卖出,也就是dp[0]
或者是冷冻期的下一天买入股票:dp[3] - prices[3]
冷冻期之后的某一天买入股票:dp[2]
*/
class Solution {
    public int maxProfit(int[] prices) {
     int[] dp =new int[4];
​
     dp[0] = -prices[0];//dp[0]表示持有股票时的最大利润
     dp[1] = 0;//表示不持有股票并且不处于冷冻期
     for(int i =1;i<=prices.length;i++){
         int temp = dp[0];
         int temp1 = dp[2];
         dp[0] =Math.max(dp[0],Math.max(dp[3],dp[1]) - prices[i-1]);//持有股票的最大利润
         dp[1] = Math.max(dp[1],dp[3]);//前一天不持有股票并且不处于冷冻期的最大利润
         dp[2] = temp + prices[i-1];//不持有股票并且处于冷冻期的最大利润
         dp[3] = temp1; //表示处于冷冻期的最大利润
     }
     return  Math.max(dp[3],Math.max(dp[1],dp[2])); 
     }  
}

● 714.买卖股票的最佳时机含手续费

class Solution {
    public int maxProfit(int[] prices, int fee) {
    int[] dp = new int[2];
    dp[0] = -prices[0];
    dp[1] = 0;
    for(int i = 1;i<=prices.length;i++){
        dp[0] = Math.max(dp[0],dp[1] - prices[i-1]);
        dp[1] = Math.max(dp[1],dp[0] + prices[i-1] - fee);
    }
    return dp[1];
    }
}

● 总结

就是很难很难

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值