首页 > 其他分享 >06_整数拆分

06_整数拆分

时间:2024-05-27 16:11:30浏览次数:28  
标签:06 乘积 int 整数 相乘 拆分 dp

343. 整数拆分

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

  • 输入: 2
  • 输出: 1
  • 解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

  • 输入: 10
  • 输出: 36
  • 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
  • 说明: 你可以假设 n 不小于 2 且不大于 58。

【思路】

动规五部曲,分析如下:

1、确定dp数组(dp)以及下标的含义

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

2、确定递推公式

dp[i]最大乘积得到的方式:

  1. 一个是j*(i-j)直接相乘
  2. 一个是j*dp[i-j],相当于是拆分(i-j)
dp[i] = max(dp[i], max((i-j) * j, dp[i-j]*j));

理解:j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

3、dp数组的初始化

dp[1]=0,dp[2]=1

4、遍历顺序

从前往后遍历即可

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

进一步的优化

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

5、举例推导dp数组

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

标签:06,乘积,int,整数,相乘,拆分,dp
From: https://www.cnblogs.com/codingbao/p/18215785

相关文章

  • 梦断代码阅读笔记06
    梦断代码阅读笔记06阅读总结在阅读《梦断代码》这本书后,我深刻感受到编程不仅是一种技能,更是一种思维方式,它对日常生活中的问题解决和思考方式有着深远的影响。通过这本书,我学到了编程思维的重要性。书中强调了逻辑思维、创造性、自动化、数据分析和解决复杂问题的能力,这些都是......
  • hdu1069java
    给你n个方块,其中每个方块具有它的长宽高(方块可以任意旋转放置),方块数量不限。现在你要堆一个高塔,上面方块的长和宽必须严格小于下面方块的长和宽。问你能堆起来的最大高度。先将方块以长和宽按从小到大排序,然后从小到大以此为底,求出最大高度。dp[i]=max(dp[j])+i.height(j.x<i.x......
  • P3406 海底高铁(C++)
    海底高铁题目描述该铁路经过NNN个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。......
  • 代码随想录算法训练营第三天 |203、707、206
    链表基础理论:https://programmercarl.com/链表理论基础.html203题目链接:https://leetcode.cn/problems/remove-linked-list-elements/203代码随想录:https://programmercarl.com/0203.移除链表元素.html#算法公开课707题目链接:https://leetcode.cn/problems/design-linked-lis......
  • 整数二分查找的实现
    引入        在一个有序数组中,如果我们想查找某一元素,朴素做法就是从前往后枚举,时间复杂度会达到。但是因为此数组是有序的,所以就可以通过这个性质,使用二分查找实现,可以使时间复杂度降到。        下面我们就来讲整数二分查找的实现。定义        ......
  • C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
    //编写代码实现:求一个整数存储在内存中的二进制中1的个数//第一种写法/*intcount_bit_one(unsignedintn){intcount=0;while(n)//除到最后余数是0,那么这个循环就结束了{//这个题就是可以想成求15的二进制的过程//每次都除以2,余数为1的时候就......
  • 复习递归------拆开了输出整数
    问题1:题目概述    这次带来的例题是一道简单题,题目概述如下:     题目要求输入一个整数n,然后从高位到低位输出每位的数字,假设我输入123,则输出必须为123。就是那么简单(数字之间用空格分开)。问题2:思路     我们之前说过递归二要素是停止条件和规......
  • 代码随想录算法训练营第第18天 | 513.找树左下角的值 、112. 路径总和 、106.从中
    找树左下角的值本地递归偏难,反而迭代简单属于模板题,两种方法掌握一下题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.找树左下角的值.html/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undef......
  • 软件工程日报066
     第一天第二天第三天第四天第五天所花时间(包括上课) 2h    代码量(行) 200    博客园(篇) 1    所学知识 控制装备的切换    ......
  • 软件工程日报068
     第一天第二天第三天第四天第五天所花时间(包括上课) 2h    代码量(行)200     博客园(篇)1     所学知识开发角色使用消耗品增加属性的功能     ......