2.< tag-动态规划和常规问题>lt.343. 整数拆分

该博客讨论了如何使用动态规划(DP)方法解决整数拆分问题,即给定一个正整数n,找到将其拆分为至少两个正整数之和的方式,以使这些正整数的乘积最大化。通过分析问题的递归性质,博主提出了DP五部曲,详细解释了如何构建递推公式并进行二维数组遍历来实现算法。代码实现中展示了Java类Solution的integerBreak方法,该方法返回整数n的最大乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lt.343. 整数拆分

[案例需求]

在这里插入图片描述

[思路分析]

  1. 为什么想到DP, 如何切入?
  • 对于的正整数 nn,当 n \ge 2n≥2 时,可以拆分成至少两个正整数的和。令 kk 是拆分出的第一个正整数,则剩下的部分是 n-kn−k,n-kn−k 可以不继续拆分,或者继续拆分成至少两个正整数的和。由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。
    在这里插入图片描述

DP五部曲
在这里插入图片描述

[代码实现]

class Solution {
    public int integerBreak(int n) {
        //n整数拆分
        //1. dp数组, 当整数为n时拆分的最大乘积为dp[n + 1]
        //2. 确定递推公式: i可拆分为j和i - j, i = j * (i - j); 
        //即i - j不再往下拆分
        // 或者说 i = j * dp[i - j], i-j继续往下拆分
        // dp[i] = max(i * (i - j), i * dp[i - j]);
        //3. 初始化 dp[0] = 0, dp[1] = 0;
        //4. 遍历顺序, i从1->n, j从1--> i- 1
        int[] dp = new int[n + 1];
        dp[0] = dp[1] = 0;

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

        return dp[n];
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值