• leetcode 123 Best Time to Buy and Sell Stock III


    参考:https://www.cnblogs.com/grandyang/p/4281975.html

      https://blog.csdn.net/linhuanmars/article/details/23236995

    动态规划的题

    local[i][j]:到第i天最多进行j次交易,且最后一次交易在第i天卖出,此时的最大的利润。

    global[i][[j]:到第i天最多进行j次交易,此时的最大利润。

    local的递推公式为:local[i][j]=max(global[i-1][j-1]+max(diff,0),local[i-1][j]+diff),其中,

      global[i-1][j-1]+max(diff,0)表示,在第i-1天共进行了j-1次交易,里面有两种情况:

        1. 第j-1次交易的卖出在i-1天之前,此时最后一次交易要么是i-1天买入,i天卖出(利润为diff),要么是i天买入,i天卖出(利润为0);

        2. 第j-1次交易的卖出在第i-1天,此时,最后一次交易要么是i-1天买入,i天卖出(也就是说,j-1次交易的卖出在第i-1天,j次交易的买入在第i-1天,卖出在第i天,利润为diff,此时global[i][j-1]=global[i][j]),要么是i天买入,i天卖出(利润为0)。

      local[i-1][j]+diff,local[i-1][j]表示第j次交易的卖出在第i-1天,+diff表示将第j次交易的卖出移动到第j天。

    global[i][j]的递推公式为:global[i][j]=max(global[i-1][j],local[i][j]),其中,global[i-1][j]表示最后一次卖出在第i天之前,local[i][j]表示最后一次卖出在第i天。

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            if(prices.empty()) return 0;
            int l[3]={0},g[3]={0};
            for(int i=0;i<prices.size()-1;++i) {
                int diff=prices[i+1]-prices[i];
                for(int j=2;j>0;--j) {
                    l[j]=max(g[j-1]+max(diff,0),l[j]+diff);
                    g[j]=max(g[j],l[j]);
                }
            }
            return g[2];
        }
    };
  • 相关阅读:
    Python常见问题
    经典SQL语句大全(转)
    VMware ESX常用命令
    每天一个linux命令(目录)
    Linux 技巧:让进程在后台可靠运行的几种方法(转)
    软件测试随手记(转)
    linux下查看磁盘空间
    MQ5.3在redhat9上的安装
    我的MQ笔记
    RedHat Linux下MQ安装步骤及MQ常用命令
  • 原文地址:https://www.cnblogs.com/LiuQiujie/p/12509307.html
Copyright © 2020-2023  润新知