在線做視頻網站最佳的資源搜索引擎
目錄
- 1.買賣股票的最佳時機含冷凍期
- 1.題目鏈接
- 買賣股票的最佳時機含冷凍期
- 2.算法原理詳解
- 3.代碼實現(xiàn)
- 2.買賣股票的最佳時機含手續(xù)費
- 1.題目鏈接
- 2.算法原理詳解
- 3.代碼實現(xiàn)
1.買賣股票的最佳時機含冷凍期
買賣股票的最佳時機含冷凍期
2.算法原理詳解
- 思路:
-
確定狀態(tài)表示 ->
dp[i][j]
的含義:i
-> 到了哪天,j
-> 當天處于什么狀態(tài)dp[i][0]
:第i
天結束之后,處于"買入"狀態(tài),此時的最大利潤dp[i][1]
:第i
天結束之后,處于"可交易"狀態(tài),此時的最大利潤dp[i][2]
:第i
天結束之后,處于"冷凍期"狀態(tài),此時的最大利潤
-
推導狀態(tài)轉移方程:本題關系復雜,可以畫圖輔助
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - p[i])
dp[i][1] = max(dp[i - 1][1], dp[i - 1][2])
dp[i][2] = dp[i - 1][0] + p[i]
-
初始化:
dp[0][0] = -p[0], dp[0][1] = dp[0][2] = 0
-
確定填表順序:從左往右,一次填寫三個表
-
確定返回值:
max(dp[n - 1][1], dp[n - 2][2])
-
3.代碼實現(xiàn)
int maxProfit(vector<int>& prices)
{int n = prices.size();vector<vector<int>> dp(n, vector<int>(3));dp[0][0] = -prices[0];for(int i = 1; i < n; i++){dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);dp[i][2] = dp[i - 1][0] + prices[i];}return max(dp[n - 1][1], dp[n - 1][2]);
}
2.買賣股票的最佳時機含手續(xù)費
1.題目鏈接
- 買賣股票的最佳時機含手續(xù)費
2.算法原理詳解
- 思路:
-
確定狀態(tài)表示 ->
dp[i]
的含義- 第
i
天結束之后,所能獲得的最大利潤 - 本題,狀態(tài)表示還可以繼續(xù)細分:
f[i]
:第i
天結束之后,處于“買入”狀態(tài),此時的最大利潤g[i]
:第i
天結束之后,處于“賣出”狀態(tài),此時的最大利潤
- 第
-
推導狀態(tài)轉移方程:本題關系復雜,可以畫圖輔助
f[i] = max(f[i - 1], g[i - 1] - p[i])
g[i] = max(g[i - 1], f[i - 1] + p[i] - fee)
-
初始化:
f[0] = -p[0], g[0] = 0
-
確定填表順序:從左往右,兩個表一起填
-
確定返回值:
g[n - 1]
-
3.代碼實現(xiàn)
int maxProfit(vector<int>& prices, int fee)
{int n = prices.size();vector<int> f(n); // 買入vector<int> g(n); // 賣出f[0] = -prices[0];for(int i = 1; i < n; i++){f[i] = max(f[i - 1], g[i - 1] - prices[i]);g[i] = max(g[i - 1], f[i - 1] + prices[i] - fee);}return g[n - 1];
}