Leetcode notes: Best Time to Buy and Stock IV
I. Description
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 encrypt the stock before you buy again ).
Ii. Question Analysis
This question is much more difficult than the previous few questions, need to use dynamic planning, code reference blog: http://www.cnblogs.com/grandyang/p/4295761.html
Here we need two Recursive formulas to update two variables respectively.localAndglobalAnd at leastkMaximum profit of a transaction. We definelocal[i][j]This is the local optimum for the maximum profit that j transactions can be performed at most on the day I and the last transaction is sold on the last day. Then we defineglobal[i][j]This is the global optimum for the maximum profit of a maximum of j transactions at the time of day I. Their recursion formula is:
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])
Iii. Sample Code
#include
#include
#include
#include
#include
using namespace std;class Solution {public: int maxProfit(int k, vector
&prices) { if(prices.empty() || k == 0) return 0; if(k >= prices.size()) return solveMaxProfit(prices); vector
global(k + 1, 0); vector
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
&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; }};