leetcode 343. 整数拆分

题目

给定一个正整数 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。

提示:

2 <= n <= 58

解析

dp[i]的定义:分拆数字i可以得到的最大乘积为dp[i]

dp[i]的最大乘积可以通过2种方式得到:

第一种(2个数相乘):

从1开始遍历j,

j*(i-j)---会被多次调用

第二种(多个数相乘)

j*dp[i-j]

dp[i-j]为重叠子问题,会被多次调用比如

复制代码
dp[5](dp[6-1],dp[7-2]...)

dp[7]为dp[2]*dp[5]与dp[3]*dp[4]等的最大值

代码

java 复制代码
import java.util.Scanner;

public class IntegerSplit {
    public static int integerBreak(int n) {
        int[] dp = new int[n+1];
        dp[2] = 1;
        for(int i = 3; i <= n; i++){
            for(int j = 1; j <= i; j++){
                dp[i] = Math.max(Math.max(j*(i-j), j*dp[i-j]),dp[i]);
            }
        }
        return dp[n];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(integerBreak(n));
    }
}

dp数组中的每一个元素都是经过一个不断扩大的循环计算出来的。

相关推荐
Q741_1472 小时前
每日一题 力扣 3418. 机器人可以获得的最大金币数 力扣 215. 数组中的第K个最大元素 动态规划 TopK问题 C++ 题解
c++·算法·leetcode·动态规划·topk
Frostnova丶3 小时前
LeetCode 3418.机器人可以获得的最大金币数
算法·leetcode
寻寻觅觅☆3 小时前
东华OJ-基础题-31-素数(C++)
开发语言·c++·算法
仟濹3 小时前
【算法打卡day36(2026-04-02 周四)】DFS专项训练3
算法·深度优先
B1acktion3 小时前
2.3.插入排序——像打牌一样整理数组,为什么它对“几乎有序”数据特别友好?
数据结构·算法·排序算法
Mr_Xuhhh3 小时前
C++算法刷题:排序子序列、削减整数、最长上升子序列(二)题解
开发语言·c++·算法
tankeven3 小时前
HJ157 剪纸游戏
c++·算法
迈巴赫车主3 小时前
蓝桥杯 19717 挖矿java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
airuike1233 小时前
高性能MEMS IMU:机器人自主运动的核心感知中枢
人工智能·算法·机器人
郝学胜-神的一滴3 小时前
PyTorch张量维度操控:transpose与permute深度拆解与实战指南
人工智能·pytorch·python·深度学习·算法·机器学习