leetcodeノート:Best Time to Buy and Sell Stock IV
4055 ワード
一.タイトルの説明
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
二.テーマ分析
この問題の難易度は前のいくつかの問題よりはるかに高く、ダイナミックな計画が必要で、コードはブログを参照しています.http://www.cnblogs.com/grandyang/p/4295761.html
ここでは、2つの変数
三.サンプルコード
四.小結
参照リンク:http://www.cnblogs.com/grandyang/p/4295761.html
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
二.テーマ分析
この問題の難易度は前のいくつかの問題よりはるかに高く、ダイナミックな計画が必要で、コードはブログを参照しています.http://www.cnblogs.com/grandyang/p/4295761.html
ここでは、2つの変数
local
およびglobal
をそれぞれ更新し、その後、少なくともk
回の取引の最大利益を求める2つの繰返し式が必要である.local[i][j]
は、i日目に到達したときに最大j回の取引が可能であり、最後の取引が最終日に販売される最大利益として定義され、これは局所的に最適である.次に、global[i][j]
を、i日目に到達したときに最大j回の取引が可能な最大利益として定義し、これはグローバルで最も優れている.これらのプッシュは次のとおりです.local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)
global[i][j] = max(local[i][j], global[i - 1][j])
三.サンプルコード
#include <vector>
#include <iostream>
#include <cstdio>
#include <climits>
#include <cmath>
using namespace std;
class Solution {
public:
int maxProfit(int k, vector<int> &prices) {
if(prices.empty() || k == 0)
return 0;
if(k >= prices.size())
return solveMaxProfit(prices);
vector<int> global(k + 1, 0);
vector<int> local(k + 1, 0);
for(int i = 1; i < prices.size(); i++) {
int diff = prices[i] - prices[i - 1];
for(int j = k; j >= 1; j--) {
local[j] = max(local[j] + diff, global[j - 1] + max(diff, 0));
global[j] = max(global[j], local[j]);
}
}
return global[k];
}
private:
int solveMaxProfit(vector<int> &prices) {
int res = 0;
for(int i = 1; i < prices.size(); i++) {
int diff = prices[i] - prices[i - 1];
if(diff > 0)
res += diff;
}
return res;
}
};
四.小結
参照リンク:http://www.cnblogs.com/grandyang/p/4295761.html