股票交易

nums表示某股票一段时间每天的价钱,某人任意一天买入和卖出,但手中最多一个股票,问其最大利润。1.动规。二维dp,dp[i][0]表示第i天手里没有股票的最大利润,dp[i][0]表示第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]),因dp[n-1][0]不小于dp[n-1][1],dp[n-1][0]即为结果。2.贪心。贪心不模拟股票交易的流程,它根据数学原理直接给出问题的解,问题的解=若干prices[r_i]-prices[l_i](后面的式子以索引代表prices的数值)之和,且若干[l_i,r_i]彼此不相交,[r_i]-[l_i]=[r_i]-[r_i-1]+[r_i-1]-[r_i-2]+\cdots+[l_i+1]-[l_i],于是可以限定r_i=l_i+1,想要的[r_i]-[l_i]是个非负数,res不断累加这个非负数得到结果

一个表示股票价格的数组prices,问这个数组中买一次股票且再卖出获得最大利润。1.暴力,找后面一个元素与前面一个元素差距的最大值。2.动规。minPrice=min(minPrice,p);maxProfit=max(maxProfit,p-minPrice);

数组的最大子数组和。pre=0,res=nums[0];for(int& num:nums)pre=max(num,pre+num),res=max(res,pre);

数组的最大乘积子数组的乘积。最近两天遇到不能套深搜加回溯模板的算法题脑子懵懵的,只能照着题解,写完基本逻辑代码,再完善一两点小批漏,AC题。跟数组的最大子数组和的计算方法相似,因为数组中存在正数和负数,维护两个最近状态值,一个是最近的最小值,另一个最近的最大值,因为最小值乘当前的负数会变为最大值。

一个表示股票价格的数组prices,问最多交易两次股票获得的最大利润。动态规划,当一天结束,处于以下五种状态之一:1还未交易过,2买了一个股票,3卖了一个股票,4买了第二支股票,5卖了第二只股票。到最后一天还未交易过的利润是0,第一天买了一个股票的利润是-prices[0],第一天买了又卖了第一天的股票利润是0,第一天买了又卖了又买了第一天的股票利润是-prices[0],第一天买了又卖了又买了又卖了第一天的股票利润是0,设某天处于状态2时获得的最大利润是buy1,处于状态3时获得的最大利润是sell1,处于状态4时获得的最大利润是buy2,处于状态5时获得的最大利润是sell2,按这种思路找最后一天处于状态5获得的最大利润即为结果,因为买卖获得的利润总归大于等于0,大于等于前面所有状态时的最大利润,但前面的状态的最大利润不能少,因为状态3需要从状态2转换更新,状态4需要从状态3转换更新,状态5需要从状态4转换更新。对于索引为1之后的日子,buy1=max(buy1,-prices[i]),或者之前已处于状态1,第i天什么都不用做,或者之前还没卖过股票,第i天买股票,同理可得如下公式,sell1=max(sell1,buy1+prices[i]),buy2=max(buy2,sell1-prices[i]),sell2=max(sell2,buy2+prices[i])。

一个表示股票价格的数组prices,问最多交易k次股票获得的最大利润,沿着股票交易三的思路,最多k次股票交易实际找前k大上升趋势高度(不一定要最长的最大高度上升趋势段,股票交易三中的中间有下降段的上坡段在股票交易四中可能以下降段作分割,因为交易次数可能增加,可以分开交易获取最大利润)的和,如果上升趋势段不够k个,也可以接受,因为交易次数不超过k次,也可以认为同一天重复交易以达到k次,另外k可能很大,prices的长度是n,则prices的上升趋势段最大有n/2个,有效交易最多有n/2次,取k=min(k,n/2),根据股票交易三的思路,则某一天刨除还未交易过,还有2*k种状态,分别是buy[1:k+1]={-prices[0]}和sell[1:k+1]={0},取buy[0]=-prices[0],sell[0]=0,访问索引大于等于1的日子的股票价格,更新2*k种状态的最大利润,buy[j]=max(buy[j],sell[j-1]-prices[i]),sell[j]=max(sell[j],buy[j]+prices[i]),最后返回sell[k]。注意n==0直接返回0,因为buy用到prices[0],会超出数组的范围

股票交易一是找出股票走势上坡段的最大高度,股票交易二是计算股票走势所有上坡段的高度和,股票交易三是求两段涵盖最大高度上坡段(上坡段中间允许下降子段,只要爬上更高峰,暂时的下降可以忍受,上升的大趋势段)的高度和

含冷冻期的股票交易,卖完股票的第二天不能买股票。每一天结束时三种状态:状态1手里有股票,状态二手里没有股票且第二天是冷静期,状态三手里没有股票且第二天不是冷静期,最大收益肯定是状态二和状态三最后的最大值,手里没有股票是最大收益的必要条件,f0=-prices[0],f1=0,f2=0,遍历股票价格状态的最大收益的转移过程:nf0=max(f0,f2-prices[i]),nf1=f0+prices[i],nf2=max(f1,f2),f0=nf0,f1=nf1,f2=nf2,最后的f1和f2中的最大值即为结果。

参考链接:122. 买卖股票的最佳时机 II
121. 买卖股票的最佳时机
53. 最大子数组和
152. 乘积最大子数组
123. 买卖股票的最佳时机 III
188. 买卖股票的最佳时机 IV
309. 最佳买卖股票时机含冷冻期

创建于2022.4.11/22.17,修改于2022.5.27/20.53

#dp #greed