309. 含有冷冻期的股票购买
股票问题是一类典型的dp问题,这个链接对于题目进行了讲解。
作为补充,我也整理一下自己的解题思路.
因为做过类似的题目所以对采用dp思想还是明确的。由于存在两个状态,持有股票,持有现金因此要采用二维的方式。
- 状态设定:
dp
表示现金存量。dp[i][1]
,表明在第i天持有股票的状态。dp[i][0]
表明在第i天持有现金的状态。 - 状态转移方程:由于添加了冷冻期限,只能在前前一天没有持有的前提下才能买入。
dp[i][0] = max(dp[i-1][1]+prices[i-2], dp[i-1][0])
h和dp[i][1] = max(dp[i-2][0]-prices[i-2], dp[i-1][1])
- 初始状态:需要考虑初始时只能买进不能卖出,两者状态下的初始值设定不同。
[0, float('-inf')]
。这个设定限制了不能再第一天就卖出。 - 卖出股票+price,买入-price
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0, float('-inf')] for _ in range(len(prices)+2)]
for i in range(2,len(prices)+2):
dp[i][0] = max(dp[i-1][1]+prices[i-2], dp[i-1][0])
dp[i][1] = max(dp[i-2][0]-prices[i-2], dp[i-1][1])
return dp[-1][0]
322. 零钱对换
一道类似的背包问题,但是也是动态规划的经典题目。
子问题就是不断的减少需要的金额总数。
class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
dp = [float('inf')]*(amount+1)
dp[0] = 0
for i in range(1,amount+1):
for j in coins:
if j<=i:
dp[i] = min(dp[i], dp[i-j]+1)
if dp[-1] == float('inf'):
return -1
return dp[-1]