diff --git a/notes/Leetcode 题解 - 动态规划.md b/notes/Leetcode 题解 - 动态规划.md
index a8365af9..643b0dc7 100644
--- a/notes/Leetcode 题解 - 动态规划.md
+++ b/notes/Leetcode 题解 - 动态规划.md
@@ -1057,7 +1057,7 @@ public int combinationSum4(int[] nums, int target) {
该题为马尔可夫过程,分为A观望,B持股,C冷却三个状态
-状态转移图:A-(观望)->A, A-(买入)->B, B-(观望)->B, B-(卖出)->C, C-(冷却)->A
+状态转移图:A-(观望)->A, A-(买入|-price)->B, B-(观望)->B, B-(卖出|+price)->C, C-(冷却)->A
可用维特比算法求解
```java
@@ -1099,24 +1099,22 @@ The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8.
题目描述:每交易一次,都要支付一定的费用。
-
+
+分为A观望,B持股,两个状态
+状态转移图:A-(观望)->A, A-(买入|-price)->B, B-(观望)->B, B-(卖出|+price|-fee)->A
```java
public int maxProfit(int[] prices, int fee) {
int N = prices.length;
- int[] buy = new int[N];
- int[] s1 = new int[N];
- int[] sell = new int[N];
- int[] s2 = new int[N];
- s1[0] = buy[0] = -prices[0];
- sell[0] = s2[0] = 0;
+ int[] A = new int[N];
+ int[] B = new int[N];
+ A[0] = 0;
+ B[0] = -prices[0];
for (int i = 1; i < N; i++) {
- buy[i] = Math.max(sell[i - 1], s2[i - 1]) - prices[i];
- s1[i] = Math.max(buy[i - 1], s1[i - 1]);
- sell[i] = Math.max(buy[i - 1], s1[i - 1]) - fee + prices[i];
- s2[i] = Math.max(s2[i - 1], sell[i - 1]);
+ A[i] = Math.max(A[i - 1], B[i - 1] + prices[i] -fee);
+ B[i] = Math.max(A[i - 1] - prices[i], B[i - 1]);
}
- return Math.max(sell[N - 1], s2[N - 1]);
+ return A[N - 1];
}
```