整数拆分(力扣)动态规划 JAVA

这篇具有很好参考价值的文章主要介绍了整数拆分(力扣)动态规划 JAVA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

里程碑意义

解题思路:

1、典型动态规划题型, 即前面所算的的值,对推导新值有铺垫作用

2、设立dp数组dp[i] = x即拆分i可以获得的最大乘积为x

3、初始值dp[2] = 1 * 1 = 1

4、进一步推导

dp[3] = max(dp[2] * 1, 2 * 1)
dp[4] = max(dp[3] * 1,dp[2] * d[2], dp[2] * 2, dp[1] * 3, 2 * 2,  3 * 1)
无非就是拆与不拆

5、再加上一些大胆的猜想不难看出dp[i]可以不拆即(i- j) * j也可以拆即dp[i - j] * dp[j]或者dp[i - j] *j取其中最大值即可

代码:

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

整数拆分(力扣)动态规划 JAVA,leetcode,动态规划,java
可以看出时间还是有些许长,仔细分析下面两行代码:

dp[i] = Math.max(dp[i], dp[i - j] * dp[j]);
dp[i] = Math.max(dp[i], dp[i - j] * j);

可以看出dp[j]是没必要拆开的,如果它要拆开的话完全可以放在dp[i - j]里,也就是说咱们写了一个重复的语句

例如:
dp[6] * dp[4] = 3 * 3 * 2* 2
等效于
dp[8] * 2 = 3 * 3 * 2 * 2

当然也可以这样理解:

对于正整数 i,当 i≥2 时,可以拆分成至少两个正整数的和。令 j 是拆分出的第一个正整数,则剩下的部分是 i−j,i−j 可以不继续拆分,或者继续拆分成至少两个正整数的和。

优化代码:

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

整数拆分(力扣)动态规划 JAVA,leetcode,动态规划,java

举一反三拆分dp[j]必然也没有问题

代码:

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

整数拆分(力扣)动态规划 JAVA,leetcode,动态规划,java文章来源地址https://www.toymoban.com/news/detail-581056.html

到了这里,关于整数拆分(力扣)动态规划 JAVA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法训练day41|动态规划 part03(LeetCode343. 整数拆分、96.不同的二叉搜索树)

    题目链接🔥🔥 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 说明: 你可以假设 n 不小于 2 且不大于

    2024年02月10日
    浏览(32)
  • 【LeetCode题目详解】第九章 动态规划part03 343. 整数拆分 96.不同的二叉搜索树 (day41补)

    给定一个正整数  n  ,将其拆分为 k 个 正整数 的和(  k = 2  ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 看到这道题目,都会想拆成两个呢,还是三个呢,还是四个.... 我们来看一下如何使用动规来解决。 # 动态规划 动

    2024年02月10日
    浏览(33)
  • 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 本题比之前面的动态规划

    2024年01月20日
    浏览(36)
  • 力扣--动态规划139.单词的拆分

    一开始,我有一个很简单的想法。 思路分析: 使用动态规划,初始化一个长度为 len + 1 的 dp 数组,其中 dp[i] 表示字符串 s 的前 i 个字符是否可以被成功拆分。 使用 unordered_set 存储 wordDict 中的单词,以提高查找效率。 外层循环遍历字符串 s ,内层循环遍历 wordDict 中的单词

    2024年02月20日
    浏览(30)
  • leetcode 动态规划(单词拆分)

    139.单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = “leetcode”

    2024年02月22日
    浏览(28)
  • 最小路径和-力扣64-java 动态规划

    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。 示例 2: 输入:grid = [[1,

    2023年04月09日
    浏览(32)
  • 零钱兑换 II 力扣(动态规划) JAVA

    给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 示例 1: 输入:amou

    2024年02月15日
    浏览(25)
  • 零钱兑换 II(力扣)动态规划 JAVA

    给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 示例 1: 输入:amou

    2024年02月16日
    浏览(30)
  • 最大正方形(力扣)暴力 + 动态规划 JAVA

    在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: 输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]] 输出:4 示例 2: 输入:m

    2024年02月15日
    浏览(54)
  • 力扣198. 打家劫舍(java 动态规划)

    Problem: 198. 打家劫舍 1.构建多阶段决策模型:n个房屋对应n个阶段,每一个阶段决定一个房间是偷还是不偷,两种决策:偷、不偷 2.定义状态:不能记录每个阶段决策完之后,小偷可偷的最大金额,需要记录不同决策对应的最大金额,也就是:这个房屋偷-对应的最大金额;这

    2024年01月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包