343. 整数拆分

题目

思路描述

  1. 问题定义

    • 给定一个正整数 n,将其拆分为 k 个正整数的和(k >= 2),并使这些整数的乘积最大化。
    • 返回可以获得的最大乘积。
  2. 状态定义

    • dp[i] 表示将数字 i 拆分成若干个正整数的和时,可以获得的最大乘积。
  3. 状态转移方程

    • dp[i] = max(dp[i], j * (i - j), j * dp[i - j]),其中 j 是从 1 到 i-1 的所有可能值。
    • 这里 j * (i - j) 表示将 i 拆分成 ji - j 两部分的乘积。
    • j * dp[i - j] 表示将 i 拆分成 jdp[i - j] 两部分的乘积。
  4. 边界条件

    • dp[1] = 1,因为 1 只能拆分成 1。
  5. 最终结果

    • dp[n]

注意事项

  1. 边界条件处理

    • 如果 n 小于等于 1,直接返回 0。
  2. 变量初始化

    • 初始化 dp 数组,dp[1] = 1
  3. 循环控制

    • 循环从 2 开始到 n,确保覆盖所有可能的数字。
  4. 空间优化

    • 使用一维数组 dp 来存储中间结果,减少空间复杂度。

代码实现

class Solution {
public:
    int integerBreak(int n) {
        if (n <= 1) return 0;

        vector<int> dp(n + 1, 0);
        dp[1] = 1;

        for (int i = 2; i <= n; ++i) {
            for (int j = 1; j < i; ++j) {
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
            }
        }

        return dp[n];
    }
};
posted @   zh&wy  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示