前言
买卖一次
买卖多次
买卖至多两次
买卖至多k次
含手续费买卖多次
冷冻期买卖多次
#include <iostream>
#include <vector>
using namespace std;
int maxProfix_one(const vector<int>& Prices) {
int len = Prices.size();
int minum = INT_MAX;
int maxnum = 0;
for (int i = 0; i < len; ++i) {
minum = min(Prices[i], minum);
maxnum = max(Prices[i] - minum, maxnum);
}
return maxnum;
}
int maxProfix_dp_one(const vector<int>& Prices) {
int len = Prices.size();
vector<vector<int>> dp(len, vector<int>(2, 0));
dp[0][0] = -Prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; ++i) {
dp[i][0] = max(dp[i - 1][0], -Prices[i]);
dp[i][1] = max(dp[i - 1][0] + Prices[i], dp[i - 1][1]);
}
int ans = dp[len - 1][1];
return ans;
}
int maxProfix_many(const vector<int>& Prices) {
int len = Prices.size();
int profix = 0;
for (int i = 0; i < len; ++i) {
profix = max(Prices[i] -Prices[i - 1], 0);
}
return profix;
}
int maxProfix_dp_many(const vector<int>& Prices) {
int len = Prices.size();
vector<vector<int>> dp(len, vector<int>(2, 0));
dp[0][0] = -Prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; ++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]);
}
int ans = dp[len - 1][1];
return ans;
}
int maxProfix_dp_2(const vector<int>& Prices) {
if (Prices.size() == 0) return 0;
vector<vector<int>> dp(Prices.size(), vector<int>(5, 0));
dp[0][1] = -Prices[0];
dp[0][3] = -Prices[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];
}
int maxProfix_dp_k(const vector<int>& Prices, const int& k) {
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) {
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];
}
int maxProfix_dp_fee(const vector<int>& Prices, const int& fee) {
int n = Prices.size();
vector<vector<int>> dp(n, vector<int>(2, 0));
dp[0][0] -= Prices[0];
for (int i = 1; i < n; 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[n - 1][0], dp[n - 1][1]);
}
int maxProfix_dp_stop(const vector<int>& Prices) {
int n = Prices.size();
if (n == 0) return 0;
vector<vector<int>> dp(n, vector<int>(4, 0));
dp[0][0] -= Prices[0];
for (int i = 1; i < n; i++) {
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - 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[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
}
void test01(const vector<int>& Prices) {
cout << "贪心算法" << endl;
int profix = maxProfix_one(Prices);
cout << "单次买卖股票最大利润为: " << profix << endl;
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_one(Prices);
cout << "单次买卖股票最大利润为: " << dp_profix << endl;
return;
}
void test02(const vector<int>& Prices) {
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_many(Prices);
cout << "多次买卖股票最大利润为: " << dp_profix << endl;
return;
}
void test03(const vector<int>& Prices) {
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_2(Prices);
cout << "至多2次买卖股票最大利润为: " << dp_profix << endl;
return;
}
void test04(const vector<int>& Prices, const int& k) {
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_k(Prices, k);
cout << "至多k次买卖股票最大利润为: " << dp_profix << endl;
return;
}
void test05(const vector<int>& Prices) {
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_stop(Prices);
cout << "冷冻期多次买卖股票最大利润为: " << dp_profix << endl;
return;
}
void test06(const vector<int>& Prices, const int& k) {
cout << "动态规划" << endl;
int dp_profix = maxProfix_dp_fee(Prices, k);
cout << "至多k含手续费多次买卖股票最大利润为: " << dp_profix << endl;
return;
}
int main() {
vector<int> Prices = { 1, 3, 2, 8, 4, 9 };
int k = 2;
test01(Prices);
test02(Prices);
test03(Prices);
test04(Prices, k);
test05(Prices);
int fee = 2;
test06(Prices, fee);
system("pause");
return 0;
}