Skip to content

Commit 2d650cc

Browse files
authored
Merge pull request #855 from somone23412/patch-5
修正两个"股票交易"算法解答,将意义不明的s状态删除
2 parents 8f1da89 + 7858dac commit 2d650cc

File tree

1 file changed

+23
-24
lines changed

1 file changed

+23
-24
lines changed

notes/Leetcode 题解 - 动态规划.md

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,27 +1055,28 @@ public int combinationSum4(int[] nums, int target) {
10551055

10561056
题目描述:交易之后需要有一天的冷却时间。
10571057

1058-
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/ffd96b99-8009-487c-8e98-11c9d44ef14f.png" width="300px"> </div><br>
1058+
1059+
该题为马尔可夫过程,分为A观望,B持股,C冷却三个状态
1060+
状态转移图:A-(观望)->A, A-(买入|-price)->B, B-(观望)->B, B-(卖出|+price)->C, C-(冷却)->A
1061+
可用维特比算法求解
10591062

10601063
```java
10611064
public int maxProfit(int[] prices) {
10621065
if (prices == null || prices.length == 0) {
10631066
return 0;
10641067
}
10651068
int N = prices.length;
1066-
int[] buy = new int[N];
1067-
int[] s1 = new int[N];
1068-
int[] sell = new int[N];
1069-
int[] s2 = new int[N];
1070-
s1[0] = buy[0] = -prices[0];
1071-
sell[0] = s2[0] = 0;
1069+
int[] A = new int[N];
1070+
int[] B = new int[N];
1071+
int[] C = new int[N];
1072+
A[0] = 0;
1073+
B[0] = C[0] = -prices[0];
10721074
for (int i = 1; i < N; i++) {
1073-
buy[i] = s2[i - 1] - prices[i];
1074-
s1[i] = Math.max(buy[i - 1], s1[i - 1]);
1075-
sell[i] = Math.max(buy[i - 1], s1[i - 1]) + prices[i];
1076-
s2[i] = Math.max(s2[i - 1], sell[i - 1]);
1075+
A[i] = Math.max(A[i - 1], C[i - 1]);
1076+
B[i] = Math.max(B[i - 1], A[i - 1] - prices[i]);
1077+
C[i] = B[i - 1] + prices[i];
10771078
}
1078-
return Math.max(sell[N - 1], s2[N - 1]);
1079+
return Math.max(A[N - 1], C[N - 1]);
10791080
}
10801081
```
10811082

@@ -1098,24 +1099,22 @@ The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8.
10981099

10991100
题目描述:每交易一次,都要支付一定的费用。
11001101

1101-
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/1e2c588c-72b7-445e-aacb-d55dc8a88c29.png" width="300px"> </div><br>
1102+
1103+
分为A观望,B持股,两个状态
1104+
状态转移图:A-(观望)->A, A-(买入|-price)->B, B-(观望)->B, B-(卖出|+price|-fee)->A
11021105

11031106
```java
11041107
public int maxProfit(int[] prices, int fee) {
11051108
int N = prices.length;
1106-
int[] buy = new int[N];
1107-
int[] s1 = new int[N];
1108-
int[] sell = new int[N];
1109-
int[] s2 = new int[N];
1110-
s1[0] = buy[0] = -prices[0];
1111-
sell[0] = s2[0] = 0;
1109+
int[] A = new int[N];
1110+
int[] B = new int[N];
1111+
A[0] = 0;
1112+
B[0] = -prices[0];
11121113
for (int i = 1; i < N; i++) {
1113-
buy[i] = Math.max(sell[i - 1], s2[i - 1]) - prices[i];
1114-
s1[i] = Math.max(buy[i - 1], s1[i - 1]);
1115-
sell[i] = Math.max(buy[i - 1], s1[i - 1]) - fee + prices[i];
1116-
s2[i] = Math.max(s2[i - 1], sell[i - 1]);
1114+
A[i] = Math.max(A[i - 1], B[i - 1] + prices[i] -fee);
1115+
B[i] = Math.max(A[i - 1] - prices[i], B[i - 1]);
11171116
}
1118-
return Math.max(sell[N - 1], s2[N - 1]);
1117+
return A[N - 1];
11191118
}
11201119
```
11211120

0 commit comments

Comments
 (0)