1.完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
方法一:动态规划
#方法一:动态规划
def numSquares(n):dp=[i for i in range(n+1)] #dp[i] 表示和为i的最小完全平方数for i in range(2,n+1):for j in range(1,int(i**0.5)+1):dp[i]=min(dp[i],dp[i-j*j]+1) #状态转移方程,等于前面数的最小完全平方数加上j*j这个本来就是的即+1return dp[-1]
2.最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
方法一:动态规划
#方法一:动态规划
def lengthOfLIS(nums):dp=[1 for i in range(len(nums))] #dp[i] 表示以i位置结尾的最长递增子序列res=0for i in range(len(nums)):for j in range(i):if nums[j]<nums[i]:dp[i]=max(dp[j]+1,dp[i]) #找到之前比当前位置元素小的res=max(res,dp[i])return res
3.买卖股票的最佳时机含冷冻期
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
方法一:动态规划
#方法一:动态规划
def maxProfit(prices):dp0,dp1,dp2=0,float('-inf'),-prices[0] #dp0表示没有股票且不在冷冻期,dp1表示在冷冻期,dp2表示持有股票所得的利益for i in range(1,len(prices)):#dp0下一个状态 #dp1 卖出去了#dp2 要么不卖出去,要么买入dp0,dp1,dp2=max(dp0,dp1),dp2+prices[i], max(dp0 - prices[i],dp2)return max(dp0,dp1,dp2)