C++数据结构与算法——动态规划股票系列
C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!
一、121. 买卖股票的最佳时机
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==1) return 0;
// 定义二维dp数组 dp[i][0] 表示第i天持有这只股票的最大利润 dp[i][1]代表第i天不持有这只股票的最大利润
vector<vector<int>> dp(prices.size(),vector(2,0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1;i<prices.size();i++){
dp[i][0] = max(dp[i-1][0],-prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);
}
return dp[prices.size()-1][1];
}
};
二、122.买卖股票的最佳时机II
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==1) return 0;
vector<vector<int>> dp(prices.size(),vector<int>(2,0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1;i<prices.size();i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);
}
return dp[prices.size()-1][1];
}
};
三、123.买卖股票的最佳时机III
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==1) return 0;
// dp[i][0] 表示不操作
// dp[i][1] 表示第一次持有股票的最大收益
// dp[i][2] 第一次未持有
// dp[i][3] 第二次持有
// dp[i][4] 第二次未持有
// 二维dp数组
vector<vector<int>> dp(prices.size(),vector<int>(5,0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] =0;
dp[0][3] = -prices[0];
dp[0][4] =0;
for(int i=1;i<prices.size();i++){
dp[i][0] = dp[i-1][0];
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);
dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);
dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]);
dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);
}
return dp[prices.size()-1][4];
}
};
四、188.买卖股票的最佳时机IV
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(prices.size()==1) return 0;
// dp数组
vector<vector<int>> dp(prices.size(),vector<int>(1+2*k,0));
// 初始化
for(int i=0;i<1+2*k;i++){
if(i%2==1){
dp[0][i] = -prices[0];
}
}
// 装包,i从1开始
for(int i=1;i<prices.size();i++){
for(int j=0;j<1+2*k;j++){
if(j==0){
dp[i][0] = dp[i-1][0];
}
else if(j%2==1){
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
}
else {
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+prices[i]);
}
}
}
return dp[prices.size()-1][2*k];
}
};
五、714. 买卖股票的最佳时机含手续费
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
if(prices.size()==1) return 0;
vector<vector<int>> dp(prices.size(),vector<int>(2,0));
dp[0][0] = -prices[0];
for(int i=1;i<prices.size();i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
}
return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);
}
};
原文地址:https://blog.csdn.net/weixin_63866037/article/details/137403186
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!