.
2019-12-8 星期日 开始吧 库里的深夜食堂
这还是关于之前做过的关于买卖股票的问题,可以看看之前的文章。这道题和之前的一个不同点是,如果你在当天卖出股票了,会有一个冷却期,即第二天不能进行任何操作。在这样的基础上,求出利润的最大值。

思路还是可以用动态规划来,老生常谈的两步,状态的定义,以及状态的转移方程,如果第一次接触动态规划,可以看看我之前写在社区的文章(https://learnku.com/articles/37063),里面还有很多例题解析,你可以自己动手查看,这里简单的说下,状态的定义这里无非是持有股票以及未持有股票的状态,状态转移值得注意的地方在于,持有股票的状态要么是前一天也是持有,要么就是前两天未持有(刚卖出去一天的冷却期),今天购买持有的状态。
/**
* @param Integer[] $prices
* @return Integer
*/
function maxProfit($prices) {
if(count($prices)==0) return 0;
$noBlock[0]=0;
$hasBlock[0]=-$prices[0];
$noBlock[1]=max($noBlock[0],$hasBlock[0]+$prices[1]);
$hasBlock[1]=max($hasBlock[0],0-$prices[1]);
for($i=2;$i<count($prices);$i++){
$noBlock[$i]=max($noBlock[$i-1],$hasBlock[$i-1]+$prices[$i]);
$hasBlock[$i]=max($hasBlock[$i-1],$noBlock[$i-2]-$prices[$i]);
}
return $noBlock[count($prices)-1];
}
