`

188 Best Time to Buy and Sell Stock IV——leetcode

阅读更多

 

class Solution {
public:
    Solution(){}

    int maxProfit(int K, vector<int> &prices) {
        vector<int> lowVec;
        vector<int > highVec;

        if(prices.size() <=1){
            return 0;
        }
        prices.erase(std::unique(prices.begin(),prices.end()),prices.end());
        if(prices.size() <=1){
            return 0;
        }
        lowVec.reserve(prices.size()/2);
        highVec.reserve(prices.size()/2);

        if(prices[0]<prices[1]){
            lowVec.push_back(prices[0]);
        }

        for(int i=1;i<prices.size()-1;i++){
            int low;
            int cur = prices[i];
            if(cur<prices[i+1] && cur<prices[i-1]){
                lowVec.push_back(cur);
            }
            if(cur>prices[i-1]&&cur>prices[i+1]){
                highVec.push_back(cur);
            }
        }
        if(prices[prices.size()-2]<prices[prices.size()-1]){
            highVec.push_back(prices.back());
        }


        int N = lowVec.size();
        if(K>=N){
            int sum=0;
            for(int i=0;i<N;i++){
                sum += highVec[i]-lowVec[i];
            }
            return sum;
        }
        
        vector<vector<int> > opt ;
        opt.resize(K+1);
        for(int i=0;i<K+1;i++)
        {
            opt[i].resize(N);
        }

        vector<int>diff;
        diff.reserve(lowVec.size());
        int sum=0;
        for(int i=0;i<N;i++){
            sum += (highVec[i]-lowVec[i]);
            diff.push_back(sum);
        }
        
        for(int k=1;k<=K;k++)
        {
            for(int i=0;i<k;i++){
                opt[k][i]= diff[i];
            }
        }
        for(int i=0;i<N;i++){
            opt[0][i]=0;
        }
       
        for(int k=1;k<=K;k++)
        {
            for(int i=k;i<N;i++)
            {
                opt[k][i] = max(opt[k][i-1],opt[k-1][i-1]+highVec[i]-lowVec[i]);
                opt[k][i] = max(opt[k][i],highVec[i]-lowVec[0]);
                for(int t=i-1;t>=k-1 && t>0;t--){
                    int highDiff = highVec[i]-highVec[t];
                    int lowDiff = lowVec[i]-lowVec[t];
                    if(highDiff>0 && lowDiff>0){
                        opt[k][i]=max(opt[k][i],opt[k-1][t-1]+highVec[i]-lowVec[t]) ;    
                    }
                    else break;
                }
            }
        }
        return opt[K][N-1];
   }
};

 

 

188 Best Time to Buy and Sell Stock IV

说明:有个地方不同其他程序。即先删除一些无用的状态(即非波峰波谷,这些状态属于中间态,因此,肯定赚钱不了的),比如 {2,3,4,3,2}其中的3就是无用状态。对于最后一个元素,如果不是涨价,也是无用,第一个元素,如果不比第二个元素小,也是无效状态

 

动态规划的主要公式:

opt[k][i]=max(opt[k][i],opt[k-1][t-1]+highVec[i]-lowVec[t]) 

即,如果选择当前第i个股价卖出,那么,需要选取第t个股价买入(0<=t<i),同时在t前面选择k-1个操作即opt[k-1][t-1]

 

分享到:
评论

相关推荐

    3、动态规划必练题(含解法).pdf

    - Best Time to Buy and Sell Stock IV:与前三者不同,可能需要多次买入和卖出。 - Best Time to Buy and Sell Stock with Cooldown:买卖后需要冷却一天。 - Best Time to Buy and Sell Stock with Transaction...

    算法模板(Java版)——leetcode刷题与复习指南.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    python-leetcode题解之122-Best-Time-to-Buy-and-Sell-Stock-II

    python python_leetcode题解之122_Best_Time_to_Buy_and_Sell_Stock_II

    圆和矩形是否重叠leetcode-leetcode_solutions:leetcode_solutions

    圆和椭圆重叠leetcode ——#158 尖端 关心特殊情况 从不同的方向思考 简单的 大批 1.Two Sum -&gt; 使用哈希表避免遍历列表448.查找数组中消失的所有数字-&gt; 1.建立缓冲区来计算数字| 2.使用数组作为带符号的缓冲区118....

    oj题.zip

    7. **122.py** - 可能是LeetCode的122题,"Best Time to Buy and Sell Stock II"(买卖股票的最佳时机II),这是一道关于动态规划或贪心策略的题目,用于找出股票交易的最佳策略。 8. **156.py** - 这可能是...

    leetcode代码200题c++

    3. **Best Time to Buy and Sell Stock II**:这是一个经典的动态规划问题,用于找出股票的最佳买卖时机,可以连续多次买卖。理解状态转移方程和动态规划的原理至关重要。 4. **Jump Game II**:此问题涉及到广度...

    leetcode-editor-7.4.zip

    为了方便开发者更高效地进行刷题,LeetCode 提供了官方编辑器插件——LeetCode Editor,本次我们关注的是它的7.4版本。这个版本的插件可以极大地简化我们在 IDEA 开发环境中使用 LeetCode 的流程,无需繁琐的配置,...

    leetcodecsdn-Leetcode:Leetcode题解(C++版),代码+详细博客说明!

    leetcode csdn Leetcode Leetcode题解(C++版),代码 + 详细博客说明 ! 所有内容见博客专栏:小题大做——Leetcode算法 欢迎提出任何问题和建议! 本人博客: 邮 箱  :

    蓝桥杯leetcode-LanQiaoCup-Python:蓝桥杯题目的Python解答,真题和一些比较复杂的题目会附上题解

    Repo——LeetCode_Python(还没创建),这个主要为面试作准备,可能会进行算法上的训练。 由于我比较穷,没钱开vip,只能做一些比较基础的题目qwq。 联系方式 Blog: Email: GitHub: 目前解题进度 基础练习( 16 / 34...

    Leetcode部分试题解析

    11. **Best Time to Buy and Sell Stock**:股票交易的最佳时机。这通常涉及动态规划或简单的贪婪算法,以确定最佳买入和卖出时间。 12. **Lowest Common Ancestor of a Binary Search Tree**:二叉搜索树的最近...

    LeetCode.swift.zip

    这里我们关注的是一个基于Swift语言的LeetCode解决方案集——LeetCode.swift.zip,它是一个开源项目,旨在为Swift开发者提供一套完整的LeetCode问题解答。 首先,Swift是一种由Apple开发的开源编程语言,设计时考虑...

    python-leetcode面试题解之第47题全排列II-题解.zip

    在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第47题“全排列II”。这道题目属于经典的回溯法(Backtracking)问题,主要考察程序员对数组操作、组合优化以及算法设计的能力。在求职...

    leetcode100-Algorithms_and_solutions:Codility和LeetCode算法问题的解决方案汇编

    本资源——"leetcode100-Algorithms_and_solutions:Codility和LeetCode算法问题的解决方案汇编"——是针对算法学习者的宝贵资料,特别是那些使用Python3编程语言的人。它汇集了100个算法问题,涵盖了 Codility 和 ...

    LeetCode原题Count and Say

    Leetcode原题Count and Say count-and-say序列是整数序列,前五个术语如下: 1. 1 2. 11 3. 21 1211 5. 111221 1被读作“1”或11。 11被读作“两个1”或21。 21被读作“一个2,然后一个1”或1211。 给定整数n,...

    python-leetcode面试题解之第305题岛屿数量II.zip

    在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第305题,名为“岛屿数量II”。这是一道典型的图论问题,涉及到深度优先搜索(DFS)或广度优先搜索(BFS)的解决策略。在面试中,这类...

    LeetCode book——CleanCodeHandbook_v1.0.1

    LeetCode book——CleanCodeHandbook_v1.0.1

    Leetcode算法刷题笔记,支持Java、C++、Go三种语言

    今天要介绍的这份宝贵的资源——《Leetcode算法刷题笔记》,涵盖了Java、C++、Go三种主流语言,助你在编码之旅中披荆斩棘,领略算法的魅力。 此笔记不仅精心挑选了Leetcode中的高频面试题目,还针对每种语言提供了...

Global site tag (gtag.js) - Google Analytics