1
+ import java .util .Arrays ;
2
+
3
+ public class Solution3573 {
4
+ private int [] prices ;
5
+ private long [][][] memo ;
6
+
7
+ public long maximumProfit (int [] prices , int k ) {
8
+ this .prices = prices ;
9
+ int n = prices .length ;
10
+ memo = new long [n ][k + 1 ][3 ];
11
+ for (int i = 0 ; i < n ; i ++) {
12
+ for (int j = 0 ; j < k + 1 ; j ++) {
13
+ Arrays .fill (memo [i ][j ], -1 );
14
+ }
15
+ }
16
+ return dfs (n - 1 , k , 0 );
17
+ }
18
+
19
+ // dfs(i, 0) 表示到第 i 天结束时完成至多 j 笔交易,未持有股票的最大利润
20
+ // dfs(i, 1) 表示到第 i 天结束时完成至多 j 笔交易,持有股票的最大利润
21
+ // 第 i-1 天结束就是第 i 天的开始
22
+ // hold 0:未持有 1:普通 2:做空
23
+ private long dfs (int i , int j , int hold ) {
24
+ if (j < 0 ) return (long ) -1e18 ;
25
+ if (i < 0 ) {
26
+ if (hold != 0 ) return (long ) -1e18 ;
27
+ return 0 ;
28
+ }
29
+ if (memo [i ][j ][hold ] != -1 ) return memo [i ][j ][hold ];
30
+ long res ;
31
+ if (hold == 0 ) {
32
+ // 什么也不干,普通交易,做空交易
33
+ res = max (dfs (i - 1 , j , 0 ), dfs (i - 1 , j , 1 ) + prices [i ], dfs (i - 1 , j , 2 ) - prices [i ]);
34
+ } else if (hold == 1 ) {
35
+ // 什么也不干,普通交易
36
+ res = max (dfs (i - 1 , j , 1 ), dfs (i - 1 , j - 1 , 0 ) - prices [i ]);
37
+ } else {
38
+ // 什么也不干,做空交易
39
+ res = max (dfs (i - 1 , j , 2 ), dfs (i - 1 , j - 1 , 0 ) + prices [i ]);
40
+ }
41
+ return memo [i ][j ][hold ] = res ;
42
+ }
43
+
44
+ private long max (long ... values ) {
45
+ long maxValue = Long .MIN_VALUE ;
46
+ for (long i : values ) {
47
+ if (i > maxValue ) {
48
+ maxValue = i ;
49
+ }
50
+ }
51
+ return maxValue ;
52
+ }
53
+ }
54
+ /*
55
+ 3573. 买卖股票的最佳时机 V
56
+ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-v/description/
57
+
58
+ 第 158 场双周赛 T2。
59
+
60
+ 给你一个整数数组 prices,其中 prices[i] 是第 i 天股票的价格(美元),以及一个整数 k。
61
+ 你最多可以进行 k 笔交易,每笔交易可以是以下任一类型:
62
+ - 普通交易:在第 i 天买入,然后在之后的第 j 天卖出,其中 i < j。你的利润是 prices[j] - prices[i]。
63
+ - 做空交易:在第 i 天卖出,然后在之后的第 j 天买回,其中 i < j。你的利润是 prices[i] - prices[j]。
64
+ 注意:你必须在开始下一笔交易之前完成当前交易。此外,你不能在已经进行买入或卖出操作的同一天再次进行买入或卖出操作。
65
+ 通过进行 最多 k 笔交易,返回你可以获得的最大总利润。
66
+ 提示:
67
+ 2 <= prices.length <= 10^3
68
+ 1 <= prices[i] <= 10^9
69
+ 1 <= k <= prices.length / 2
70
+
71
+ 记忆化搜索。在 188 题基础上改改即可。
72
+ 相似题目: 188. 买卖股票的最佳时机 IV
73
+ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
74
+ */
0 commit comments