My code:
public class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length <= 1) {
return 0;
}
int n = prices.length;
int[] s0 = new int[n];
int[] s1 = new int[n];
int[] s2 = new int[n];
s0[0] = 0;
s1[0] = -prices[0];
s2[0] = Integer.MIN_VALUE;
for (int i = 1; i < n; i++) {
s0[i] = Math.max(s0[i - 1], s2[i - 1]);
s1[i] = Math.max(s0[i - 1] - prices[i], s1[i - 1]);
s2[i] = s1[i - 1] + prices[i];
}
return Math.max(s0[n - 1], Math.max(s1[n - 1], s2[n - 1]));
}
}
reference:
https://discuss.leetcode.com/topic/30680/share-my-dp-solution-by-state-machine-thinking/2
這道題目看了解釋后才做出來(lái)。我覺(jué)得上面的解釋說(shuō)的很好诺凡。
這是一種新的DP類型。通過(guò)畫 狀態(tài)機(jī)來(lái)解決問(wèn)題腹泌。
狀態(tài)機(jī)畫出來(lái)后,問(wèn)題也就解決了芥吟。
只需要處理一些 corner case专甩。
這道題目很像那個(gè) robber 的題。他也是不能連續(xù)的偷携添。但是他是累加篓叶,這個(gè)有個(gè)買賣的先后關(guān)系,所以更難缸托。
那道題目就兩個(gè)狀態(tài)。
s0 s1
s0 --> rest s0
s0 --> steal s1
s1 --> rest s0
s0[i] = max(s0[i - 1], s1[i - 1]);
s1[i] = s0[i - 1] + money[i];
My code:
public class Solution {
public int rob(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
else if (nums.length == 1) {
return nums[0];
}
int n = nums.length;
int[] s0 = new int[n + 1];
int[] s1 = new int[n + 1];
s0[0] = 0;
s1[0] = 0;
for (int i = 1; i <= n; i++) {
s0[i] = Math.max(s0[i - 1], s1[i - 1]);
s1[i] = s0[i - 1] + nums[i - 1];
}
return Math.max(s0[n], s1[n]);
}
}
Anyway, Good luck, Richardo! -- 08/26/2016