309.最佳買賣股票時(shí)機(jī)含冷凍期
動(dòng)規(guī)五部曲
確定dp數(shù)組以及下標(biāo)的含義
dp[i][j],第i天狀態(tài)為j,所剩的最多現(xiàn)金為dp[i][j]
狀態(tài)一:持有股票狀態(tài)
狀態(tài)二:保持賣出股票的狀態(tài)
狀態(tài)三:今天賣出股票
狀態(tài)四:今天為冷凍期狀態(tài)
操作一:前一天就是持有股票狀態(tài)(狀態(tài)一)开泽,dp[i][0] = dp[i - 1][0]
操作二:今天買入了,有兩種情況
前一天是冷凍期(狀態(tài)四)魁瞪,dp[i - 1][3] - prices[i]
前一天是保持賣出股票的狀態(tài)(狀態(tài)二)穆律,dp[i - 1][1] - prices[i]
dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i])
dp[i][1]惠呼,兩個(gè)操作:
操作一:前一天就是狀態(tài)二
操作二:前一天是冷凍期(狀態(tài)四)
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];
dp數(shù)組初始化
dp[0][0] = -prices[0]
dp[0][1] =0?
dp[0][2]=0
dp[0][3] = 0
intmaxProfit(vector<int>&prices){intn=prices.size();if(n==0)return0;vector<vector<int>>dp(n,vector<int>(4,0));dp[0][0]-=prices[0];// 持股票for(inti=1;i<n;i++){dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));dp[i][1]=max(dp[i-1][1],dp[i-1][3]);dp[i][2]=dp[i-1][0]+prices[i];dp[i][3]=dp[i-1][2];}returnmax(dp[n-1][3],max(dp[n-1][1],dp[n-1][2]));}
714.買賣股票的最佳時(shí)機(jī)含手續(xù)費(fèi)
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
intmaxProfit(vector<int>&prices,intfee){intn=prices.size();vector<vector<int>>dp(n,vector<int>(2,0));dp[0][0]-=prices[0];// 持股票for(inti=1;i<n;i++){dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);}returnmax(dp[n-1][0],dp[n-1][1]);}