122. 买卖股票的最佳时机 II
解题思路:
1.贪心 假设我们从第二天开始每天都在卖出,将产生的正利润记录,以局部最优累积得全局最优,
2.动态规划 dp[i][j] 标识第i天股票持有状态为j的最大利润值。j 为0时未持有,j为1时持有
那么状态转移方程就为
dp[i][0] = max(dp[i-1][1] - prices[i], dp[i-1][0]);//第i天持有的状态可以是由第i-1天未持有然后在第i天买入 或者是 第i-1天就未持有转换过来,两者取利润的最大值
dp[i][1] = max(dp[i-1][0] + prices[i], dp[i-1][1]);//第i天的未持有状态可以由 第i-1天的持有在第i天卖出,或者是 第i-1天就已经未持有转换,两者也取利润最大值
1 class Solution { 2 public: 3 int maxProfit(vector<int>& prices) { 4 const int maxn = 3e4+10; 5 int ans = 0; 6 int iSize = prices.size(); 7 //贪心解法 8 //for(int i = 1; i < iSize; ++i)//只计算相邻两天正利润累积入总利润即可。 9 // ans += max(prices[i]-prices[i-1], 0); 10 //return ans; 11 //dp解法 12 int dp[maxn][2];//dp[i][j] 为第i天股票持有状态为j的最大利润 j为0未持有,1为持有 13 memset(dp,0,sizeof(dp)); 14 dp[0][0] = 0; 15 dp[0][1] = -prices[0]; 16 for(int i = 1; i < iSize; ++i) 17 { 18 dp[i][0] = max(dp[i-1][1] + prices[i], dp[i-1][0]); 19 dp[i][1] = max(dp[i-1][0]-prices[i], dp[i-1][1]); 20 } 21 return max(dp[iSize-1][0], dp[iSize-1][1]); 22 } 23 };