Skip to content

Commit b81824b

Browse files
committed
sol 309 and 714
1 parent 7446488 commit b81824b

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

c_code/309_maxProfitV.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
}

c_code/714_maxProfitIV.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

c_code/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@
6060
# 其他
6161
1 两数之和 关键在于排序和夹逼求和
6262
43. 字符串相乘 || 常用于大数相乘,此题思路清楚,但代码容易出错,特别是进位要多练习
63-
123买卖股票的状态转移初始化不熟,需要多练 动态规划
63+
123 买卖股票的最佳时机 IV(困难)|| 买卖股票的状态转移初始化不熟,需要多练 动态规划
6464

6565

0 commit comments

Comments
 (0)