方向一笔记-个人笔记01:动态规划问题 | 豆包MarsCode AI 刷题

54 阅读2分钟

动态规划问题应遵循状态定义、列出状态转移方程、确定边界条件等步骤。

例:股票市场交易策略优化

(问题描述)小R近期表现出色,公司决定以股票的形式给予奖励,并允许他在市场上进行交易以最大化收益。给定一个数组,数组中的第i个元素代表第i天的股票价格。小R需要设计一个算法来实现最大利润。

股票交易规则如下:

小R可以多次买卖股票,但在买入新的股票前必须卖出之前的股票。

每次卖出股票后存在一天的冷冻期,在冷冻期内小R不能购买股票。

你的任务是帮助小R计算出在遵守交易规则的情况下能够获得的最大利润。

stocks: 一个整数列表,表示连续几天内的股票价格。

(思路分析)

(1)定义:每一天有两种状态,持有/未持有股票。

dp[i][0], 第i天未持有股票的最大所得利润

dp[i][1], 第i天持有股票的最大所得利润

(2)动态转移方程:

dp[i][1] = max(dp[i-1][1], dp[i-2][0]-stocks[i]); 什么都不干,或者从两天前无股票状态,买入股票(因为有一天冷冻期)。

dp[i][0] = max(dp[i-1][0], dp[i-1][1]+stocks[i]); 什么都不干,或者从前一天的持股票状态,卖出股票。

dp[i-1][0]这个状态可能是:① 第i天卖出,② 第i-1天前卖出,故当前处于非冷冻期,③第i-1天前卖出且处于冷冻期。

对于情形①③,第i天都不能买入股票;对于情形②,第i-1天为非冷冻期, 那么第i-2天也为非冷冻期,所以这两天的状态相同,即dp[i-1][0] = dp[i-2][0]。

(3)边界条件:

dp[0][0]=0, dp[0][1]=-stocks[0],

dp[1][0]=max(0,dp[0][1]+stocks[1])=max(0,-stocks[0]+stocks[1]);

dp[1][1]=max(dp[0][1],dp[0][0]-stocks[1])=max(stocks[

(4)遍历顺序: 对stocks,从前往后遍历(下标范围为[2,n-1])

(5)返回值: dp[n-1][0] 不持有股票的利润一定最大

进一步优化,用变量pre0表示dp[i-2][0],用变量f0表示dp[i][0],用变量f1表示dp[i][1]。

(复杂度分析)记stocks的数组长度为n,则时间复杂度为O(n),经过变量优化后,不需要使用2*n大小的dp数组,故空间复杂度为O(1)。