一、买卖股票最佳时机1
1、题目:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
2、代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N = 1e6;
const int M = 1e5;
int prices[N];
int dp[M][2];
int main() {
cin >> n;
if (n == 0) cout << 0;
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < n; i++) {
dp[i][0] = max(dp[i - 1][0], -prices[i]);
dp[i][1] = max(dp[i - 1][1], prices[i]);
}
int result = max(dp[n - 1][0], dp[n - 1][1]);
cout << result;
}
二、买卖股票最佳时机2
1、题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2、代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N = 1e6;
const int M = 1e5;
int prices[N];
int dp[M][2];
int main() {
cin >> n;
if (n == 0) cout << 0;
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
dp[0][0] = -prices[0];
dp[0][1] = 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], prices[i]);
}
int result = max(dp[n - 1][0], dp[n - 1][1]);
cout << result;
}
三、买卖股票最佳时机3
1、题目:
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
2、代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6;
int prices[N];
int dp[N][4];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
if (n == 0) return 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 < n; 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]);
}
cout << dp[n - 1][4];
}
四、买卖股票最佳时机4
1、题目:
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2、代码:
#include<iostream>
#include<algorithm>
using namespace std;
int k, n;
int prices[1010];
int dp[1010][2 * k + 1];
int main() {
cin >> k >> n;
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
for (int j = 1; j < 2 * k; j += 2) {
dp[0][j] = -prices[0];
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < 2 * k; 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]);
}
cout << dp[n - 1][2 * k];
return 0;
}
}