加油 ( •̀ ω •́ )y!

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 };
View Code

 

posted @ 2022-07-05 20:57  皮皮虎  阅读(55)  评论(0编辑  收藏  举报