买卖股票的最佳时机
class Solution {
public:
int maxProfit(vector<int>& prices) {
long long Min=1e5;
long long sum=0;
for(int i=0;i<prices.size();i++)
{
sum=max(sum,prices[i]-Min);
if(Min>prices[i])
{
Min=prices[i];
}
}
return sum;
}
};
买卖股票的最佳时机 II
#include<bits/stdc++.h>
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxn=1e5;
int dp[maxn][2];
fill(dp,dp+maxn*2,0);
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.size();i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
}
return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);
}
};
买卖股票的最佳时机 III
思路与算法
由于我们最多可以完成两笔交易,因此在任意一天结束之后,我们会处于以下五个状态中的一种:
- 未进行过任何操作;
- 只进行过一次买操作;
- 进行了一次买操作和一次卖操作,即完成了一笔交易;
- 在完成了一笔交易的前提下,进行了第二次买操作;
- 完成了全部两笔交易。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int> >dp(prices.size(),vector<int> (5));
dp[0][0]=0;
dp[0][1]=-prices[0];
dp[0][2]=0;
dp[0][3]=-prices[0];
dp[0][4]=0;
for(int i=1;i<prices.size();i++)
{
dp[i][0]=0;
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]);
dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]);
dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);
}
return dp[prices.size()-1][4];
}
};
买卖股票的最佳时机 IV
-
先做一下预处理
特判:如果prices长度是0或1,返回0;如果k为0,返回0
n天最多交易n/2次,如果k>n/2的话其实交易不了这么多次,所以 k = min(k, n//2) -
初始化状态
在第0天,如果是奇数,表示买入,如果是偶数,表示卖出,如果是买入,初始化一定是-prices[0],如果是卖出,一定初始化为0. -
状态转移
外层循环从prices[1]开始往后遍历
内层循环遍历所有状态进行相应的状态转移
dp[0]一直为0所以不用转移,从dp[1]开始转移
如果当前状态索引j为奇数,也就是手头有股票的情况
dp[i] [j] = max(dp[i-1][j], dp[i-1][j - 1] - prices[i])
前一天也是dp[j]状态;或者前一天是dp[j - 1]状态,今天卖出一笔变成dp2状态
如果当前状态索引j为偶数,也就是手头没有股票的情况
dp[i][j] = max(dp[i-1][j], dp[i-1][j - 1] + prices[i])
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
// prices.insert(prices.begin(),0);
vector<vector<int> >dp(prices.size()+5,vector<int> (k*2+10));
int n=prices.size();
if(n<2||k==0) return 0;
k=min(k,n/2);
for(int i=0;i<k*2+10;i++)
{
if(i%2==0) dp[0][i]=0;
else dp[0][i]=-prices[0];
}
int Max=0;
for(int i=1;i<prices.size();i++)
{
//dp[i][0] 直接是0,没有意义。
for(int j=1;j<=k*2;j++)
{
if(j%2!=0)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);
Max=max(dp[i][j],Max);
}
}
return Max;
}
};
买卖股票的最佳时机含手续费
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(2));
dp[0][0] = 0, dp[0][1] = -prices[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp[n - 1][0];
}
};
最佳买卖股票时机含冷冻期
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.empty()) {
return 0;
}
int n = prices.size();
// f[i][0]: 手上持有股票的最大收益
// f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
// f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
vector<vector<int>> f(n, vector<int>(3));
f[0][0] = -prices[0];
for (int i = 1; i < n; ++i) {
f[i][0] = max(f[i - 1][0], f[i - 1][2] - prices[i]);
f[i][1] = f[i - 1][0] + prices[i];
f[i][2] = max(f[i - 1][1], f[i - 1][2]);
}
return max(f[n - 1][1], f[n - 1][2]);
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/solution/zui-jia-mai-mai-gu-piao-shi-ji-han-leng-dong-qi-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。