343 整数拆分
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积
# 动态规划
def integerBreak(n:int)->int:dp=[0]*(n+1)dp[2]=1 #从下标为2开始 (n为1或0没有意义)for i in range(3,n+1):for j in range(1,i//2+1):[]dp[i]=max(dp[i],(i-j)*j,dp[i-j]*j)# 将i拆分,第一个整数j,不在拆分 乘积 j*(i-j)# 将i拆分,第一个整数j,还要拆分 乘积 j*dp[i-j] (dp[i-j]是最大的拆分乘积数)return dp[n]# 贪心 拆分为m个3,剩下是4,保留4
def integerBreak(n):if n==2:return 1if n==3:return 2if n==4:return 4result=1while n>4:result*=3n-=3result*=nreturn result
96 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
def numTrees(n:int)->int:dp=[0]*(n+1)dp[0]=1for i in range(n+1):for j in range(1,i+1): # j表示头节点的数值dp[i]+=(dp[j-1]*dp[i-j]) #左子树个数*右子树个数return dp[n]