题目:
Say you have an array for which the ith element is the price of a given stock on day i.
【LeetCode 题解(82): Best Time to Buy and Sell Stock IV】Design an algorithm to find the maximum profit. You may complete at mostk transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
题解:
需要用两个表来记录:a) 在i天内(包括i)进行至多j次交易的最大获利,用global[i][j]表示,及 b) 第i天卖出股票,完成至多j次交易的最大获利,用local[i][j]表示。
那么递推关系式为:
local[0][j] = global[0][j] = 0, for j = 0,...,k
local[i][j] = max(global[i-1][j-1] + prices[i]-prices[i-1], local[i-1][j] + prices[i] - prices[i-1])
global[i][j] = max(globals[i-1][j], local[i][j])
其中: global[i-1][j-1] + prices[i]-prices[i-1] 表示:前i-1天完成了j-1笔交易的最大获利,加上,第i-1天买入并在第i天卖入的收入
local[i-1][j] + prices[i] - prices[i-1] 表示:前i-1已经完成了j笔交易,并且最后一次卖出是在第i-1天发生呢,那么我们把卖出时间推迟一天(由i-1推迟到i),则仍是j笔交易,但是利润变化为prices[i] - prices[i-1],所以我们还要加上这一部分。
global的递推比较好理解:要么在i-1天完成j笔交易,要么第i天完成第j笔交易。
c++版:
class Solution {
public:
int maxProfit(int k, vector &prices) {
if(k > prices.size()) {
int profit = 0;
for(int i = 1;
i < prices.size();
i++)
if(prices[i] > prices[i-1])
profit += prices[i] - prices[i-1];
return profit;
}vector local(k+1, 0);
vector global(k+1, 0);
for(int i = 1;
i < prices.size();
i++) {
for(int j = 1;
j <= k;
j++) {
local[j] = max(global[j-1] + max(prices[i] - prices[i-1], 0), local[j] + prices[i] - prices[i-1]);
}
for(int j = 1;
j <= k;
j++) {
global[j] = max(global[j], local[j]);
}
}
return global[k];
}
};
Java版:
public class Solution {
public int maxProfit(int k, int[] prices) {
if(k > prices.length) {
int gain = 0;
for(int i = 1;
i < prices.length;
i++)
if(prices[i] > prices[i-1])
gain += prices[i] - prices[i-1];
return gain;
}int[] global = new int[k+1];
int[] local = new int[k+1];
for(int i = 1;
i < prices.length;
i++) {
for(int j = 1;
j <= k;
j++) {
local[j] = Math.max(global[j-1] + prices[i] - prices[i-1], local[j] + prices[i] - prices[i-1]);
}
for(int j = 1;
j <= k;
j++) {
global[j] = Math.max(global[j], local[j]);
}
}
return global[k];
}
}
Python版:
class Solution:
# @return an integer as the maximum profit
def maxProfit(self, k, prices):
if k > len(prices):
profit = 0
for i in range(1, len(prices)):
if prices[i] > prices[i-1]:
profit += prices[i] - prices[i-1]
return profitGlobal = [0] * (k+1)
Local = [0] * (k+1)
for i in range(1, len(prices)):
for j in range(1, k+1):
Local[j] = max(Global[j-1] + prices[i]-prices[i-1], Local[j] + prices[i] - prices[i-1])
for j in range(1, k+1):
Global[j] = max(Global[j], Local[j])
return Global[k]
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络