day42
继续完成了买卖股票的题(最多交易k次、冷冻期、手续费)
最多交易k次:
//动态规划,最多只能买卖k次--分情况考虑(奇数持有,偶数卖出)
//dp[i][j]:i为第几天,j为状态,奇数时是持有,偶数时是不持有
//递推公式:
//dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);//今天之前就持有了或者今天才买入
//dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);//昨天就不持有或者今天才卖出
//初始化:第0天的所有状态都要初始化,偶数为0,奇数为-prices[0];
//遍历顺序:外层遍历天数i,内层遍历j状态.
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2*k+1, 0));
for(int j = 1; j < 2*k; j+=2)//更新奇数情况下第0天的值
{
dp[0][j] = -prices[0];
}
for(int i = 1; i < prices.size(); i++)
{
for(int j = 0; j < 2*k-1; j+=2)
{
dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);
dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);
}
}
return dp[prices.size() - 1][2*k];
冷冻期:
//动态规划--不限交易次数,但有冷冻期,即卖出的第二天不能操作
//分情况考虑--持有、不持有、冷冻期
//递推公式:
//持有:昨天已持有、今天买昨天之前就卖了、今天买昨天冷冻期
//dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i], dp[i-1][3] + prices[i]);
//不持有:保持卖出状态(前一天就是保持卖出状态,或者前一天是冷冻期)
//dp[i][1] = max(dp[i-1][1], dp[i-1][3]);
//不持有:今天卖
//dp[i][2] = dp[i-1][0] + prices[i];
//冷冻期:昨天卖
//dp[i][3] = dp[i-1][2];
//初始化:第0天全初始化为0
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
dp[0][0] = -prices[0]; // 持股票
for(int i = 1; i < prices.size(); i++)
{
dp[i][0] = max(dp[i-1][0], max(dp[i-1][1] - prices[i], dp[i-1][3] - prices[i]));
dp[i][1] = max(dp[i-1][1], dp[i-1][3]);
dp[i][2] = dp[i-1][0] + prices[i];
dp[i][3] = dp[i-1][2];
}
return max(dp[prices.size() - 1][1], max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]));
手续费:简单,在卖出时再减去手续费就行。
最多交易k次:
//动态规划,最多只能买卖k次--分情况考虑(奇数持有,偶数卖出)
//dp[i][j]:i为第几天,j为状态,奇数时是持有,偶数时是不持有
//递推公式:
//dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);//今天之前就持有了或者今天才买入
//dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);//昨天就不持有或者今天才卖出
//初始化:第0天的所有状态都要初始化,偶数为0,奇数为-prices[0];
//遍历顺序:外层遍历天数i,内层遍历j状态.
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2*k+1, 0));
for(int j = 1; j < 2*k; j+=2)//更新奇数情况下第0天的值
{
dp[0][j] = -prices[0];
}
for(int i = 1; i < prices.size(); i++)
{
for(int j = 0; j < 2*k-1; j+=2)
{
dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j] - prices[i]);
dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);
}
}
return dp[prices.size() - 1][2*k];
冷冻期:
//动态规划--不限交易次数,但有冷冻期,即卖出的第二天不能操作
//分情况考虑--持有、不持有、冷冻期
//递推公式:
//持有:昨天已持有、今天买昨天之前就卖了、今天买昨天冷冻期
//dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i], dp[i-1][3] + prices[i]);
//不持有:保持卖出状态(前一天就是保持卖出状态,或者前一天是冷冻期)
//dp[i][1] = max(dp[i-1][1], dp[i-1][3]);
//不持有:今天卖
//dp[i][2] = dp[i-1][0] + prices[i];
//冷冻期:昨天卖
//dp[i][3] = dp[i-1][2];
//初始化:第0天全初始化为0
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
dp[0][0] = -prices[0]; // 持股票
for(int i = 1; i < prices.size(); i++)
{
dp[i][0] = max(dp[i-1][0], max(dp[i-1][1] - prices[i], dp[i-1][3] - prices[i]));
dp[i][1] = max(dp[i-1][1], dp[i-1][3]);
dp[i][2] = dp[i-1][0] + prices[i];
dp[i][3] = dp[i-1][2];
}
return max(dp[prices.size() - 1][1], max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]));
手续费:简单,在卖出时再减去手续费就行。
全部评论
相关推荐
07-07 14:03
安徽大学 Java 点赞 评论 收藏
分享
06-23 12:08
广州大学 硬件测试 小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享