[Thoughts]
One dimensional dynamic planning.
Given an i, split the whole array into two parts:
[0,i] and [i+1, n], it generates two max value based on i, Max(0,i) and Max(i+1,n)
So, we can define the transformation function as:
Maxprofix = max(Max(0,i) + Max(i+1, n)) 0<=i<n
------------------------------------------------------------
先从前往后找出每个i(i>0)之前(包括此位置)交易所有可能最大profit值,记录为 max_left[i].
在从后往前找出每个位置之后交易所有可能最大profit值,记录为 max_right[i].
接下来就简单了。一个for loop 解决问题。
Solution: dp. max profit = max { l2r[0...i] + r2l[i+1...N-1] }.
0 <= i <= N-1
int maxProfit(vector<int> &prices) {
int N = prices.size();
if (N <= 1) return 0;
int l2r[N], r2l[N];
l2r[0] = 0;
r2l[N-1] = 0;
int minn = prices[0];
for (int i = 1; i < N; ++i)
{
minn = min(minn, prices[i]);
l2r[i] = max(l2r[i-1], prices[i] - minn);
}
int maxx = prices[N-1];
for (int i = N-2; i >= 0; --i)
{
maxx = max(maxx, prices[i]);
r2l[i] = max(r2l[i+1], maxx - prices[i]);
}
int res = l2r[N-1];
for (int i = 0; i < N-1; ++i)
res = max(res, l2r[i] + r2l[i+1]);
return res;
}
类比: 此题可以candy的次优解法对看:http://codeganker.blogspot.com/2014/03/candy-leetcode.html
No comments:
Post a Comment