題目:一個人一天只能進行最多兩次買和兩次賣,並且只有賣了才能繼續買。問一天可以獲得的最大收益,要采用時間復雜度低的實現。
輸入:5 2,4,6,8,10.輸出:8 (2買,10賣)
輸入:6 10,22,5,75,65,80.輸出:87 (10買,22賣,5買,80賣)
動態規划解決方法:設置數組dp[i][j]表示:prices[i]買入到prices[j]賣出的收益。則得出dp[i][j]為
0 12 -5 65 55 70
0 0 -17 53 43 58
0 0 0 70 60 75
0 0 0 0 -10 5
0 0 0 0 0 15
0 0 0 0 0 0
然后:先找出最大值的位置和買入賣出的時間,題中是75最大,買入i=2,賣出j=5
然后根據買入賣出的時間,算出除此之外時間段的最大值
代碼如下:
-
public static int maxProfit(int[] prices, int length) {
-
int res = 0;
-
int dp[][] = new int[length][length];
-
for (int i = 0; i < length - 1; i++) {
-
for (int j = i + 1; j < length; j++) {
-
dp[i][j] = prices[j] - prices[i];
-
System.out.print(dp[i][j] + " ");
-
}
-
-
}
-
-
int max = 0;
-
int ma2 = 0;
-
int start = 0;
-
int end = 0;
-
for (int i = 0; i < length; i++)
-
for (int j = i + 1; j < length; j++) {
-
if (dp[i][j] > max) {
-
max = dp[i][j];
-
start = i;
-
end = j;
-
}
-
}
-
System.out.println(start + " " + end + " " + max);
-
for (int i = 0; i < start; i++)
-
for (int j = i + 1; j < start; j++) {
-
if (dp[i][j] > ma2) {
-
ma2 = dp[i][j];
-
-
}
-
}
-
-
if (end < length - 1)
-
for (int i = end + 1; i < length; i++) {
-
for (int j = i + 1; j < length; j++) {
-
if (dp[i][j] > ma2) {
-
ma2 = dp[i][j];
-
-
}
-
}
-
}
-
res = max + ma2;
-
return res;
-
}