File tree Expand file tree Collapse file tree 3 files changed +73
-1
lines changed Expand file tree Collapse file tree 3 files changed +73
-1
lines changed Original file line number Diff line number Diff line change
1
+ #include limits .h
2
+
3
+ 采用状态机来遍历
4
+ 买前必须卖完 ,买完再卖出去才算一笔交易
5
+ 模板
6
+ 状态转移方程 :
7
+ dp [i ][k ][0 ] = max (dp [i - 1 ][k ][0 ], dp [i - 1 ][k ][1 ] + price [i ]);
8
+ dp [i ][k ][1 ] = max (dp [i - 1 ][k ][1 ], dp [i - 1 ][k - 1 ][0 ] - price [i ]);
9
+
10
+ Base Case
11
+ dp [-1 ][k ][0 ] = 0 ;
12
+ dp [-1 ][k ][1 ] = - Infinity ; 不可能
13
+ dp [i ][0 ][0 ] = 0 ;
14
+ dp [i ][0 ][1 ] = - Infinity ;
15
+
16
+ output dp [n - 1 ][k ][0 ]
17
+ #define max (a , b ) (a) (b) (a) (b)
18
+ #define MAX_K_NUM 2
19
+ 冷冻期一天条件转化为 :一旦发现卖出 ,则跳过下一天循环 = 此思路不对 ,会导致无法推广转移矩阵 ,得到所有可能情况
20
+ 正确做法 ,修改状态转移方程 ,买入时 ,从前两天不持有状态的数组转移过来 ,i - 1 变为 i - 2
21
+ int maxProfit (int prices , int pricesSize )
22
+ {
23
+ k = + infinity
24
+ int dp_i_0 = 0 ;
25
+ int dp_i_1 = INT_MIN ;
26
+ int i ;
27
+ int pre_dp_i_0 = 0 ;
28
+ for (i = 0 ; i pricesSize ; i ++ ) {
29
+ dp [i ][k ][0 ] = max (dp [i - 1 ][k ][0 ], dp [i - 1 ][k ][1 ] + price [i ]); 不动或卖出
30
+ dp [i ][k ][1 ] = max (dp [i - 1 ][k ][1 ], dp [i - 2 ][k - 1 ][0 ] - price [i ]); 不动或买入
31
+ int tmp = dp_i_0 ; 更新前
32
+ dp_i_0 = max (dp_i_0 , dp_i_1 + prices [i ]); 当前更新后
33
+ dp_i_1 = max (dp_i_1 , pre_dp_i_0 - prices [i ]);
34
+ pre_dp_i_0 = tmp ; 下次循环用时 ,就变成了前两天的
35
+ }
36
+ return dp_i_0 ;
37
+ }
Original file line number Diff line number Diff line change
1
+ #include <limits.h>
2
+
3
+ // 采用状态机来遍历
4
+ // 买前必须卖完,买完再卖出去才算一笔交易
5
+ /**** 模板 **********
6
+ 状态转移方程:
7
+ dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + price[i]);
8
+ dp[i][k][1] = max(dp[i - 1][k][1], dp[i - 1][k - 1][0] - price[i]);
9
+
10
+ Base Case:
11
+ dp[-1][k][0] = 0;
12
+ dp[-1][k][1] = -Infinity; //不可能
13
+ dp[i][0][0] = 0;
14
+ dp[i][0][1] = -Infinity;
15
+ ********************/
16
+ // output: dp[n - 1][k][0]
17
+ #define max (a , b ) (a) > (b) ? (a) : (b)
18
+ #define MAX_K_NUM 2
19
+ int maxProfit (int * prices , int pricesSize , int fee )
20
+ {
21
+ // k = +infinity
22
+ int dp_i_0 = 0 ;
23
+ int dp_i_1 = INT_MIN ;
24
+ int i ;
25
+ for (i = 0 ; i < pricesSize ; i ++ ) {
26
+ // dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + price[i] - fee); // 卖出时才扣手续费
27
+ // dp[i][k][1] = max(dp[i - 1][k][1], dp[i - 1][k - 1][0] - price[i]);
28
+ int tmp_dp_i_0 = dp_i_0 ;
29
+ // 注意防止超过int最小值, 如 INT_MIN + 1 - 2 就溢出了
30
+ int tmp = ((long long )dp_i_1 + prices [i ] - fee < INT_MIN ) ? INT_MIN : (dp_i_1 + prices [i ] - fee );
31
+ dp_i_0 = max (dp_i_0 , tmp );
32
+ dp_i_1 = max (dp_i_1 , tmp_dp_i_0 - prices [i ]);
33
+ }
34
+ return max (dp_i_0 , dp_i_1 );
35
+ }
Original file line number Diff line number Diff line change 60
60
# 其他
61
61
1 两数之和 关键在于排序和夹逼求和
62
62
43 . 字符串相乘 || 常用于大数相乘,此题思路清楚,但代码容易出错,特别是进位要多练习
63
- 123。 买卖股票的状态转移初始化不熟,需要多练 动态规划
63
+ 123 买卖股票的最佳时机 IV(困难)|| 买卖股票的状态转移初始化不熟,需要多练 动态规划
64
64
65
65
You can’t perform that action at this time.
0 commit comments