zoukankan      html  css  js  c++  java
  • leetcode_买卖股票_dp状态机

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    // 122. 买卖股票的最佳时机 II---通过
    // 执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
    // 内存消耗:12.8 MB, 在所有 C++ 提交中击败了16.13%的用户
    // 可无数次交易
    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int n=prices.size();
            int dp[30000][2];
            dp[0][1]=-prices[0];
            for(int i=1; i<n; ++i)
            {
                dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
                dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
            }
            return dp[n-1][0];
        }
    };
    
    
    // 123. 买卖股票的最佳时机 III---通过
    // 执行用时:4 ms, 在所有 C++ 提交中击败了82.92%的用户
    // 内存消耗:10.9 MB, 在所有 C++ 提交中击败了39.83%的用户
    // 可2次交易(代码同 188. 买卖股票的最佳时机 IV, 令k=2)
    
    
    // 188. 买卖股票的最佳时机 IV---通过
    // 执行用时:8 ms, 在所有 C++ 提交中击败了79.25%的用户
    // 内存消耗:11.3 MB, 在所有 C++ 提交中击败了54.25%的用户
    class Solution {
    public:
        int maxProfit(int k, vector<int>& prices) {
            int n=prices.size();
            if(n<=0) return 0;
            int dp[1000][101][2];
            for(int j=1; j<=k; ++j)
                dp[0][j][1]=-prices[0]; //当成当天可买卖处理 忽略dp[0][0][1]遍历不到
            for(int i=1; i<n; ++i)
            {
                for(int j=1; j<=k; ++j)
                {
                    dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1]+prices[i]);
                    dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0]-prices[i]);
                }
            }
            return dp[n-1][k][0];
        } 
    };
    
    // 309. 最佳买卖股票时机含冷冻期---通过
    // 执行用时:4 ms, 在所有 C++ 提交中击败了81.13%的用户
    // 内存消耗:10.9 MB, 在所有 C++ 提交中击败了81.59%的用户
    // 可无数次交易 有一天冷冻期 (代码同122. 买卖股票的最佳时机 II i-1改成i-2隔天交易)
    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int n=prices.size();
            if(n==1) return 0;
            int dp[30000][2];
            dp[0][1]=-prices[0];
            dp[1][0]=max(0,prices[1]-prices[0]);
            dp[1][1]=max(-prices[0],-prices[1]);
            for(int i=2; i<n; ++i)
            {
                dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
                dp[i][1] = max(dp[i-1][1], dp[i-2][0]-prices[i]);
            }
            return dp[n-1][0];
        }
    };
    
    
    // 714. 买卖股票的最佳时机含手续费---通过
    // 执行用时:100 ms, 在所有 C++ 提交中击败了89.62%的用户
    // 内存消耗:54.1 MB, 在所有 C++ 提交中击败了45.85%的用户
    // 可无数次交易(代码同122. 买卖股票的最佳时机,计算收益时减去手续费)
  • 相关阅读:
    2017-2018-1 20155304 20155332 实验二 固件程序设计
    《信息安全技术》实验二 口令破解
    2017-2018-1 20155304 《信息安全系统设计基础》第六周学习总结
    2017-2018-1 20155304 20155310 20155337 实验一 开发环境的熟悉
    2017-2018-1 20155304 《信息安全系统设计基础》第五周学习总结
    第五周 加分题-mybash的实现
    2017-2018-1 20155304 《信息安全系统设计基础》第四周学习总结
    2017-2018-1 20155304 《信息安全系统设计基础》第三周学习总结
    课下作业2
    课下作业1
  • 原文地址:https://www.cnblogs.com/exciting/p/14672771.html
Copyright © 2011-2022 走看看