题解 | #牛群买卖计划# 状态机DP
牛群买卖计划
https://www.nowcoder.com/practice/3e4ae511b4a941b788da5077b08a7d07
知识点
状态机DP
思路
定义 f[i][j][st] 前i天完成j笔交易,手上股票持有状态为st 的价值最大值。状态转移可以分为当前股票保持或者卖出两种状态,就可以进行转移。答案为前n天手上持有状态为0的最大值。时间复杂度
AC Code(C++)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param prices int整型vector
* @return int整型
*/
const int INF = 0x3f3f3f3f;
int f[100010][4][2]; // f[i][j][st] 前i天完成j笔交易 手上股票持有状态为st 的最大值
int maxProfit(vector<int>& prices) {
int n = prices.size();
for (int i = 0; i <= 3; i ++) {
f[0][i][0] = f[0][i][1] = -INF;
}
f[0][0][0] = 0;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= 3; j ++) {
// 不动 / 进行买卖
f[i][j][0] = max(f[i - 1][j][1] + prices[i - 1], f[i - 1][j][0]);
f[i][j][1] = max(f[i - 1][j - 1][0] - prices[i - 1], f[i - 1][j][1]);
}
}
int res = 0;
for (int i = 0; i <= 3; i ++) {
res = max(res, f[n][i][0]);
}
return res;
}
};

查看9道真题和解析