343. 整数拆分
1. first idea
dp[i]表示正整数i的拆分后的最大乘积。
计算时我意识到 而不是.
所以我们其实要做比较
但是这样仍然是有问题的,比如。 这个不符合上述两种情况的任何一种,
它既不满足也不满足,而是.
所以我们的内层操作并不是这两种情况的比较,
而是.
class Solution:
def integerBreak(self, n: int) -> int:
dp = [0] * (n + 1)
dp[1] = 1
dp[2] = 1
for idx in range(3, n + 1):
max_dp = max(dp[1] * dp[idx - 1], 1 * (idx - 1))
for j in range(1, (n // 2) + 1):
if max_dp < (max(dp[j], j) * max(dp[idx - j], idx - j)):
max_dp = max(dp[j], j) * max(dp[idx - j], idx - j)
dp[idx] = max_dp
# print(dp)
return dp[-1]
96. 不同的二叉搜索树
1. first idea
dp[i]表示有i个节点时,能构建多少种二叉树。
但是怎么通过前置结果推这个结果我还不确定。
2. doc reading
1~(j-1)号节点构成左子树;
(j+1)~i号节点构成右子树。
初始化:
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n + 1)
dp[0] = 1
for idx in range(1, n + 1):
for root_idx in range(1, idx + 1):
dp[idx] += dp[root_idx - 1] * dp[idx - root_idx]
return dp[-1]