Suzy进入期末周了 Day41 | 动态规划进行时:343. 整数拆分,96. 不同的二叉搜索树

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]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值