08.01三步问题
- ## 主要思路:
假设现在求到i阶阶梯的方法种数dp[i],可以考虑它的上一步,分为三种情况:从i-1阶迈一步到达,i-1阶的方法数dp[i-1]; 从i-2阶一次上2阶到达,方法数dp[i-2]; 从i-3阶一次上3阶到达,方法数dp[i-3]。 因此dp[i]=dp[i-1]+dp[i-2]+dp[i-3]为状态转移方程。
class Solution:
def waysToStep(self, n: int) -> int:
if n<3:
return n
if n==3:
return 4
dp=[0]*(n+1)
dp[0],dp[1],dp[2],dp[3]=0,1,2,4
for i in range(4,n+1):
dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007
return dp[n]
17.16 按摩师
主要思路:
dp[i-1]代表请求序列长度为i时的最优解,也就是最长分钟数。
序列长度为1时,dp[0]=nums[0]
序列长度为2时,dp[1]=max(nums[0],nums[1])
序列长度为3时,dp[2]=max(nums[1],nums[0]+nums[2]) //因为要保证不能相邻,所以三个元素要么选中间一个,要么选第一个与第三个的和,两者比较选最大值
序列长度为4时,dp[3]=max(dp[2],dp[1]+nums[3]) 如果选择nums[3],nums[2]一定不能选,最大长度为0~1 的最大长度即dp[1]加上nums[3];如果不选nums[3],最大长度即为0~2 的最长时间dp[2];两种情况选择最大。
状态转移方程为dp[i]=max(dp[i-1],dp[i-2]+nums[i])。
class Solution:
def massage(self, nums: List[int]) -> int:
if not nums:
return 0
dp=[0 for _ in nums]
if len(nums)==1:
return nums[0]
if len(nums)==2:
return max(nums[1],nums[0])
dp[0]=nums[0]
dp[1]=max(nums[1],nums[0])
for i in range(2,len(nums)):
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
return dp[-1]
自己写的有点复杂,看了官方的答案,果然够简洁又明了
class Solution:
def massage(self, nums: List[int]) -> int:
last,now=0,0
for num in nums:
last,now=now,max(last+num,now)
return now