● 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]; } }
● 总结
就是很难很难