难度:mid
题目描述
示例
解法1:动态规划
定义状态
dp[i][0]: 第i天操作后,不持股,所获得的最大利润
dp[i][1]: 第i天操作后,持股,所获得的最大利润
状态转移方程
dp[i][0]: 第i天有两种情况(第i天操作后,不持股)
- 前一天操作结束后,还持有1支股票,第i天卖掉。
- 前一天操作结束后,不持有股票,第i天也不买股票。
-
dp[i][0] = max(dp[i-1][1]+prices[i], dp[i-1][0])
dp[i][1]:第i天(第i天操作后,持股)
- 前一天操作结束后,还持有1支股票,第i天不买股票
- 前一天操作结束后,不持有股票,第i天买一支股票
-
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
完整代码
int max(int a, int b){
if(a>b)
return a;
else
return b;
}
int maxProfit(int* prices, int pricesSize) {
int dp[pricesSize][2];
int i;
// dp[i][0]: 第i天操作后,不持股,所获得的最大利润
// dp[i][1]: 第i天操作后,持股,所获得的最大利润
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(i = 1; i < pricesSize; i ++){
dp[i][0] = max(dp[i-1][1]+prices[i], dp[i-1][0]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
}
return dp[pricesSize-1][0];
}
时间复杂度:
本来想写点详细过程的,但是感觉动态规划类的题目还是多做吧,做多了自然会。