动态规划----股票买卖
1. 分析股票状态
dp[ i ][ 0 ] 持有 在这之前已经买了股票或者在当天购入股票
dp[ i ][ 1 ] 不持有 在这之前已经卖掉了或者在当天卖掉
还有可能是第k次买入卖出 都是一样的
2. 更新
dp[ i ][ 0 ] 我手头剩的钱越多越好 (手头上的钱减去买入的)
只买一次 那么每次手头上的钱都是 -price
可以买多次,那么手头剩下的钱就是 dp[ i - 1 ][ 1 ] - price
dp[ i ][ 1 ] 我挣的钱的钱越多越好(手头钱加上卖出的)
得到的钱 就是 dp[ i - 1 ][ 0 ] + price
针对第 i 天 有两种情况:
dp[ i ][ 0 ] 持有 在这之前已经买了股票或者在当天购入股票
dp[ i ][ 1 ] 不持有 在这之前已经卖掉了或者在当天卖掉
dp[ i ] [ 0 ] 的更新
无论如何我希望我手中的钱剩的越多越好 两种情况取max
如果第 i - 1 天就持有股票 dp[ i ][ 0 ] = dp[ i - 1 ][ 0 ]
在第 i 天 买入股票 dp[ i ][ 0 ] = -price[ i ]
dp[ i ] [ 1 ] 的更新 两种情况取max
无论如何我希望我卖出股票之后,挣得越多越好
如果之前就卖出了 dp[ i ][ 1 ] = dp[ i - 1 ][ 1 ]
在第 i 天 卖出股票 dp[ i ][ 1 ] = dp[ i ][ 0 ] + prices[ i ]
初始化 dp[ 0 ][ 0 ] = -price[0] dp[0][1] = 0;
class Solution {
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>>dp(len, vector<int>(2, 0));
dp[0][0] = - prices[0];
dp[0][1] = 0;
for(int i=1; i<len; i++){
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[len-1][1];
}
};