买卖股票的最佳时机
题型一:给一个价格数组,求买卖一次可以取得的最大值
设dp数组dp[i][0]为第i天持有股票的收益,相反的设dp[i][1]为第i天已经抛售掉股票的收益
显然可得递推公式:
dp[i][0]=dp[i-1][0]或-price[i]中的最大值;
dp[i][1]=dp[i-1]+price[i]或dp[i-1][1];
由图可见,第i层相当于给第i+1层打表,dp[i][0]相当于利用前面的状态迭代为下一层求得上一层买入时的最小花费,而dp[i][1]则是记忆每一天根据前几天的状态求得的最大收益与当天价格加上之前买入收益之和比较后得到的较大值罢了,最终输出dp[price.size()][1]即可
题型二:给定一个价格数组,你可以多次买卖股票
依旧设dp数组dp[i][0]为第i天持有股票的收益,相反的设dp[i][1]为第i天已经抛售掉股票的收益
显然可得递推公式:
递推公式:
dp[i][0]=dp[i-1][0]或dp[i-1][1]-price[i](因为不能连续的只买不卖,所以必须的是前天卖出后才能再次买入)的最大值//此处是想让下一次买入股票前的开销最少,例如-10,-5,肯定是让想方设法的让开销接近更大的-5,减少花费
dp[i][1]=dp[i-1][1]或dp[i-1][0]+price[i]中的最大值;
在本次之前买入并在这次卖出求得的利润与之前就卖出的利润求最大值,便是获得的最大利润
总结:由题意,显然每次只能买或卖,即dp[i][0]与dp[i][1]二者并不能同时满足,则是dp[i][0]为下一个阶段的dp[i+1][1]服务,而dp[i][1]由dp[i-1][0]服务,即dp[i][1]才是每次真正要求的值,前面的只不过是为了后面打表迭代罢了;