一、买卖股票的最佳时机
dp[1] 持有股票
dp[0]卖出股票(赚更多的钱就卖)
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
//初始手里0元
//dp[1][j]表示持有股票后,手里最多多少钱(即用最小成本购买)
//dp[0][j]表示不持有股票,手里最多多少钱
vector<vector<int>> dp(2,vector<int>(prices.size()));
dp[1][0]=-prices[0];
for(int j=1;j<prices.size();j++)
{
dp[1][j]=max(dp[1][j-1],-prices[j]);
//prices[j]+dp[1][j-1] 即当前的卖出价格加上买完股票后还剩多少钱
dp[0][j]=max(dp[0][j-1],prices[j]+dp[1][j-1]);
}
return dp[0][prices.size()-1];
}
};
二、买卖股票的最佳时机II
dp[1][j]=max(dp[1][j-1],dp[0][j-1]-prices[j]);
一个是继续持有先前状态的股票
一个是卖出先前股票(前一个状态,不持有股的现金)再买入,即实现了多次购买
防止高买底卖,max()防止卖出之后,再买入亏得更多 ,保证每一次操作都是赚的
如1,2,3,4,5 则dp[1][j] 一直为-1 因为卖出先前股票(前一个状态,不持有股的现金)再买入
比之前亏
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
//初始手里0元
//dp[1][j]表示持有股票后,手里最多多少钱(即用最小成本购买)
//dp[0][j]表示不持有股票,手里最多多少钱
vector<vector<int>> dp(2,vector<int>(prices.size()));
dp[1][0]=-prices[0];
for(int j=1;j<prices.size();j++)
{
dp[1][j]=max(dp[1][j-1],dp[0][j-1]-prices[j]);
//prices[j]+dp[1][j-1] 即当前的卖出价格加上买完股票的钱
dp[0][j]=max(dp[0][j-1],prices[j]+dp[1][j-1]);
}
return dp[0][prices.size()-1];
}
};