<LeetCode天梯>Day003 买卖股票的最佳时机 II(动态规划法) | 初级算法 | Python

简介: <LeetCode天梯>Day003 买卖股票的最佳时机 II(动态规划法) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题,则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

数组


image.png

image.png

题干

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。


设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。


注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。


接着上一篇Blog:<LeetCode天梯>Day002 买卖股票的最佳时机 II | 初级算法 | Python


动态规划法

第一步:定义状态

定义 dp[ i ][ j ] 为:


其中 dp[ i ][ j ] 表示到下标为 i 的这一天,持股状态为 j 时,我们手上拥有的最大现金数。


注意:限定持股状态为 j 是为了方便推导状态转移方程,这样的做法满足无后效性。


其中:


第一维 i 表示下标为 i 的那一天( 具有前缀性质,即考虑了之前天数的交易 );

第二维 j 表示下标为 i 的那一天是持有股票,还是持有现金。这里 0 表示持有现金(cash),1 表示持有股票(stock)。

第二步:状态转移方程

状态从持有现金(cash)开始,到最后一天我们关心的状态依然是持有现金(cash);

每一天状态可以转移,也可以不动。状态转移用下图表示:

image.png

第三步:确定初始值

从一开始:


若不做操作,则 dp[0][0] = 0;

如果持有股票,当前拥有的现金数是当天股价的相反数,即 dp[0][1] = -prices[i];

第四步:确定最终值

当我们计算到最后一天的时候,由此可知,


输出 dp[len - 1][0],因为一定有 dp[len - 1][0] > dp[len - 1][1]

class Solution:
    def maxProfitByDP(self, prices):
        n = len(prices)
        if n < 2:
            return 0
        dp = [0]*n
        print(dp)
        dp[0] = prices[0]   # 将prices的第一天的价格赋给dp[0]
        maxValue = 0   # 当前最多能赚多少钱
        maxProfit = 0  # 最终的总最大收益
        for i in range(1, n):
            dp[i] = min(dp[i-1], prices[i])    # 更新当前最低价格
            if prices[i] - dp[i] < maxValue:
                maxProfit += maxValue
                dp[i] = prices[i]
                maxValue = 0
            else:
                maxValue = prices[i] - dp[i]
        maxProfit += maxValue
        return maxProfit

image.png

image.png

image.png

相关文章
|
1月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
284 1
|
存储 算法
深入了解动态规划算法
深入了解动态规划算法
259 1
|
8月前
|
存储 算法 Java
算法系列之动态规划
动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。
293 4
算法系列之动态规划
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
323 2
|
9月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
235 5
|
8月前
|
算法 安全 调度
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
|
8月前
|
机器学习/深度学习 算法 测试技术
【动态规划篇】01 背包的逆袭:如何用算法装满你的 “财富背包”
【动态规划篇】01 背包的逆袭:如何用算法装满你的 “财富背包”
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
527 2
动态规划算法学习三:0-1背包问题
|
11月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
220 2

热门文章

最新文章

推荐镜像

更多