当前位置:   article > 正文

3.6 log | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,300.最长递增子序列

3.6 log | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,300.最长递增子序列

309.最佳买卖股票时机含冷冻期

  1. class Solution {
  2. public:
  3. int maxProfit(vector<int>& prices) {
  4. int len=prices.size();
  5. vector<vector<int>> dp(len,vector<int>(4,0));
  6. dp[0][0]=0;
  7. dp[0][1]=0;
  8. dp[0][2]=-prices[0];
  9. dp[0][3]=0;
  10. for(int i=1;i<len;i++){
  11. dp[i][0]=dp[i-1][2]+prices[i];
  12. dp[i][1]=max(dp[i-1][3],dp[i-1][1]);
  13. dp[i][2]=max(dp[i-1][2],max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));
  14. dp[i][3]=dp[i-1][0];
  15. }
  16. return max(dp[len-1][0],max(dp[len-1][1],dp[len-1][3]));
  17. }
  18. };

这道题添加了冷冻期,卖了的第二天不能交易,处于冷冻期,所以把一天分为四个状态,dp[i][0]表示当天卖出,dp[i][1]表示卖出天数>1,dp[i][2]表示持有状态,dp[i][3]表示当前处于冷冻期,这四种状态包括了所有可能状态

714.买卖股票的最佳时机含手续费

  1. class Solution {
  2. public:
  3. int maxProfit(vector<int>& prices, int fee) {
  4. int len= prices.size();
  5. vector<vector<int>> dp(len,vector<int>(2,0));
  6. dp[0][0]=0;
  7. dp[0][1]=-prices[0];
  8. for(int i=1;i<len;i++){
  9. dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
  10. dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
  11. }
  12. return dp[len-1][0];
  13. }
  14. };

这道题可以多次买卖,不过买卖一次要给一次的手续费,只需要在当天卖出股票状态时减去fee就能把解决

300.最长递增子序列

  1. class Solution {
  2. public:
  3. int lengthOfLIS(vector<int>& nums) {
  4. int len=nums.size();
  5. vector<int> dp(len,1);
  6. dp[0]=1;
  7. int result=0;
  8. for(int i=0;i<len;i++){
  9. for(int j=0;j<i;j++){
  10. if(nums[j]< nums[i]) dp[i]=max(dp[i],dp[j]+1);
  11. }
  12. result=max(result,dp[i]);
  13. }
  14. return result;
  15. }
  16. };

这道题dp[i]的含义为以nums[i]结尾的最长子序列长度,dp[i][的初始化为全为1,因为子序列至少长度为1,递推公式为dp[i]=max(dp[i],dp[j]+1),i从前向后遍历,j在[0,i)的范围内遍历,每一个dp[i]都要比较,选出最大值返回

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/211985
推荐阅读
相关标签
  

闽ICP备14008679号