343. Integer Break
题目
Given an integer n, break it into the sum of k positive integers, where k >= 2, and maximize the product of those integers.
Return the maximum product you can get.
solution
看的解析
class Solution:
def integerBreak(self, n: int) -> int:
# 注意是break in to k>=2个数字的乘积
# dp[i]表示将i切分成两个或者两个以上的数字连乘后的最大值
dp=[0]*(n+1)
dp[2]=1
for i in range(3,n+1):
for j in range(1,i//2+1):
# 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
# 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
# 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
strategy=max(j*(i-j),j*dp[i-j])
dp[i]=max(dp[i],strategy)
return dp[-1]
96. 不同的二叉搜索树
题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
solution
抄的答案
class Solution:
def numTrees(self, n: int) -> int:
dp=[0]*(n+1) # n node -> (0)1...n
dp[0]=1
dp[1]=1
for i in range(2,n+1): #1,...,n
for j in range(0,i):
#0,..,n-1
dp[i]+=dp[j]*dp[i-1-j]
return dp[-1]