整数拆分——动态规划

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:

复制代码
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

复制代码
输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

思路:

如果最优结果包含一个因子f>=4,那么你可以将其替换为因子2和f-2,而不会丧失最优性,因为

2*(f-2)=2f-4>=f。如此一来,你便无需使用任何大于或等于4的因子,这意味着你只需要用到1、2和3这三种因子(当然,1是一种浪费,仅会在n=2和n=3时才需用到它。)

python 复制代码
class Solution:
    def integerBreak(self, n: int) -> int:
        if n <= 3:
            return n - 1
        
        dp = [0] * (n + 1)
        dp[2] = 1
        for i in range(3, n + 1):
            dp[i] = max(2 * (i - 2), 2 * dp[i - 2], 3 * (i - 3), 3 * dp[i - 3])
        
        return dp[n]

自己写的一版:

让所有的拆分数尽可能的相等,这样的乘积是最大的。

python 复制代码
class Solution:
    def integerBreak(self, n: int) -> int:
        res = 0
        for i in range(2, n // 2 + 1):
            base = n // i
            baseAddNum = n - base * i
            res = max(res, base ** (i-baseAddNum) * ((base + 1) ** baseAddNum))
        return res
print(Solution().integerBreak(10))
相关推荐
I'm Jie3 分钟前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
打工仔折腾 AI8 分钟前
FaceFusion本地换脸实战:Windows整合包、模型选择与遮罩调参记录
人工智能·windows·后端·python·深度学习·性能优化·ai agent 实战
yi0119 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳10 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
kimnoic20 分钟前
Python常用命令提示符使用方法详解
开发语言·python
Crazy________21 分钟前
05Linux内存管理核心原理与运维实战
java·开发语言
Logic10123 分钟前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
Nebula_g23 分钟前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff29 分钟前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
程序员老陆33 分钟前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++