zoukankan      html  css  js  c++  java
  • LeetCode 309 Best Time to Buy and Sell Stock with Cooldown 解决方案

    题目描述

    给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

    设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

    • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
    • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

    示例:

    输入: [1,2,3,0,2]
    输出: 3 
    解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

    解决方案1

    可以通过一个状态转换图,来解决。

    定义状态

    s0 : 没有买股票时
    s1 :买入股票且没有卖出股票时
    s2:卖出股票是
    

    那么状态转换可以这样表示

    so->s1   买股票  s0->s0不操作
    s1->s2   卖股票  s1->s1不操作
    s2->s0  经过冷冻期  s2->s2 不操作
    

    转换图也可以画出来:
    在这里插入图片描述
    那么每一次价格变动都会在这三个状态里
    得出递推式

    s0[i] = max(s0[i - 1], s2[i - 1]);   不操作 和  冷冻期过去
    s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]); 不操作 和 买股票
    s2[i] = s1[i - 1] + prices[i];  卖出股票
    

    最终的状态应该会在s0和s2终态度有关, 因为s1是卖出股票 是 会比s0小的,
    最优解表示为 max(s0[最后一次价格变动],s2[最后一次价格变动])

    具体代码如下;

    class Solution {
    public:
        int maxProfit(vector<int>& prices){
            if (prices.size() <= 1) return 0;
            vector<int> s0(prices.size(), 0);
            vector<int> s1(prices.size(), 0);
            vector<int> s2(prices.size(), 0);
            //初始化 
            s1[0] = -prices[0];
            s0[0] = 0;
            s2[0] = INT_MIN;
            //状态转移
            for (int i = 1; i < prices.size(); i++) {
                s0[i] = max(s0[i - 1], s2[i - 1]);
                s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]);
                s2[i] = s1[i - 1] + prices[i];
            }
            return max(s0[prices.size() - 1], s2[prices.size() - 1]);
        }
    };
    

    总结

    这个动态规划问题竟然能用一种状态转换的方式来得到也是很神奇了, 动态规划关键是找到此时最优解和上一次的最优解之间的关系,而这个题目最优解是有2个状态产生的,而状态直接又有着紧密的关系,所以用状态转换图来理清关系,找到最优解的更新表示,最终得到结果。还是值得深思的。

  • 相关阅读:
    coredump文件设置及调试
    github上传本地代码库步骤
    ubuntu上SVN版本升级到1.7
    ubuntu 上samba创建共享组目录
    linux下创建只有某个用户组可用的文件夹
    usermod -a表示在原来所属组的基础上追加
    linux mount
    Ubuntu Bash and Dash
    svn co 默认密钥' GNOME keyring
    精简版ffmpeg编译脚本
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9901052.html
Copyright © 2011-2022 走看看