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

解析

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

dpi的最大乘积可以通过2种方式得到:

第一种(2个数相乘):

从1开始遍历j,

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

第二种(多个数相乘)

j*dpi-j

dpi-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数组中的每一个元素都是经过一个不断扩大的循环计算出来的。

相关推荐
moshuying2 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王2 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT3 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying3 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记3 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
labuladong4 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun614 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法4 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然4 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one4 小时前
算法--桶思想
java·开发语言·算法