题意
给定一个数组,其中
ai
代表第i天股票的价格为
ai
。你可以进行多次买卖,但是手中最多同时持有1支股票,并且某天卖出股票后,在那之后的一天不能进行任何买卖(cooldown)。
求能获得的最大利润。
思路
状态表示:
d[i,j]
代表第i天是否持股。
j=1
代表持股,
j=0
代表不持股。
状态转移:
1. 如果第i天不持股股票:可能是前一天就没有股票;或者前一天持股,在第i天卖掉了。
2. 如果第i天持股:可能是前一天也持股;或者前两天不持股(cooldown),第i天买入一支股票。
转移方程:
d[i,0]=max{d[i−1,0],d[i−1,1]+a[i]}
d[i,1]=max{d[i−1,1],d[i−2][0]−a[i]}
细节
注意当i不超过第2天的时候持股的转移。
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> d(prices.size(), vector<int>(2, 0));
if (prices.size()) {
d[0][0] = 0, d[0][1] = -prices[0];
for (int i = 1; i < prices.size(); i++) {
d[i][0] = max(d[i - 1][1] + prices[i], d[i - 1][0]);
d[i][1] = max(d[i - 1][1], (i >= 2 ? d[i - 2][0] : 0) - prices[i]);
}
return d[prices.size() - 1][0];
}
return 0;
}
};