343、整数拆分:
class Solution(object):
def integerBreak(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n+1)
dp[0], dp[1] = 0, 0
dp[2] = 1
for i in range(3, n+1):
for j in range(1, i):
dp[i] = max(j*(i-j), j*dp[i-j], dp[i])
return dp[n]
dp数组定义为正整数为i时最大拆分乘积为dp[i],因为可拆分为两个整数j 与 i-j,更多的可拆分i-j,因此可以推导出递推公式
96、不同的二叉搜索树:
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n + 1)
dp[0] = 1
for i in range(1, n+1):
for j in range(1, i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[n]
解放巧妙,对于一个固定的正整数n,所能构造的二叉搜索树数目依赖于根节点从1到n时构造二叉树的数目之和,再利用二叉搜索树的特性确定dp[j-1]*dp[i-j]为每一种根节点对应的二叉树数量,可得到递推公式