【力扣刷题】整数拆分(动态规划)

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

 

【力扣刷题】整数拆分(动态规划)个人简历:全栈领域新星博主,万粉博主、帮助初学者入门,记录自己的学习过程

【力扣刷题】整数拆分(动态规划)个人主页:天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主

【力扣刷题】整数拆分(动态规划)热门专栏:初学者入门C语言_天寒雨落的博客-CSDN博客

 【力扣刷题】整数拆分(动态规划)

目录

动态规划

整数拆分

题目

思路

代码

执行结果


【力扣刷题】整数拆分(动态规划)

动态规划

其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,经分解得到子问题往往不是互相独立的,举个简单的例子:你知道两个1相加等于2,问你三个1相加你是拿前面的两个1相加的结果加上1呢,还是再用1+1+1,你肯定会用前面的那种方法对吧,这就是动态规划,(1+1)就是(1+1+1)的子问题,且并不是相互独立,你得到了(1+1)就好得到(1+1+1)了

【力扣刷题】整数拆分(动态规划)

整数拆分

题目

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

思路

对于正整数 n,当 n≥2 时,可以拆分成至少两个正整数的和。令 x 是拆分出的第一个正整数(取值范围为1~(n-1)),则剩下的部分是 n-x

n-x有两种情况 :

1.不可以继续拆分,那么乘积就是x*(n-x)

2.可以继续拆分成至少两个正整数的和,那么乘积就是x*((n-x)的乘积最大化),将子问题求的解即将2到n的所有乘积最大化存入数组dp[n]中,那么乘积就是x*dp[n-x]

用for循环按照上面的方法求2~n的乘积最大化,比如:

求2的乘积最大化:

不可以继续拆分,乘积是1*(2-1)为1

求3的乘积最大化: 

可以拆分为1和2,2不拆分的乘积为2,拆分的乘积为1*dp[3-1]也就是1,取不拆分的乘积和拆分的乘积的最大值为2

求4的乘积最大化:

可以拆分为1和3,3不拆分的乘积为3,拆分的乘积为1*dp[4-1]也就是2,取不拆分的乘积和拆分的乘积的最大值为3

可以拆分为2和2,2不拆分的乘积为4,拆分的乘积为2*dp[4-2]也就是2,取不拆分的乘积和拆分的乘积的最大值为4

这和上面两个不一样,它可以拆分为1和3,2和2两种情况,所以要求1和3,2和2之间的最大值为4

依次类推......

因为求最大值的功能经常使用,使用用三目运算符?:写个求最大值的函数Max()

由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。

代码

#include <stdio.h>
int Max(int i, int j);

int main() {
	int n;
	printf("n=");
	scanf("%d", &n);
	int dp[n] = {0, 0};

	for (int i = 2; i <= n; i++) {
		int max = 0;

		for (int j = 1; j < i; j++) {
			max = Max(max, Max(j * (i - j), j * dp[i - j]));
		}

		dp[i] = max;
	}

	printf("%d", dp[n]);
	return 0;
}

int Max(int i, int j) {
	return i > j ? i : j;
}

执行结果

【力扣刷题】整数拆分(动态规划)

为了更好的观察 ,可以在

dp[i] = max;

后面加个

printf("%d\n", dp[i]);

可以看到2~10所有的乘积最大化

【力扣刷题】整数拆分(动态规划)

创建数组dp时,其中dp[i] 表示将正整数 i 拆分成至少两个正整数的和之后,这些正整数的最大乘积。特别地,00 不是正整数,11 是最小的正整数,00 和 11 都不能拆分,因此dp[0]和dp[1]一定要赋值为0,如果不赋值为0,直接int dp[n];就会出现以下状况

【力扣刷题】整数拆分(动态规划)

 赋初值为0:

【力扣刷题】整数拆分(动态规划)

 👍+✏️+⭐️是对博主最大的鼓励与支持!!!文章来源地址https://www.toymoban.com/news/detail-435684.html

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

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

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

相关文章

  • 力扣刷题笔记-07 整数反转

    狗看了都摇头的年纪,纯爱战士一败涂地。 temp用来保存个位数 res用来保存当前结果 123,取模运算,这样就可以获得最后一位。比如对123%10,得到temp=3. 判断res是不是溢出( 重点 ) 如果没有溢出,res扩大十倍,再加上个位数,就相当于是反转了。res = res * 10 + temp; 返回res。

    2024年02月08日
    浏览(43)
  • 力扣刷题笔记-08 字符串转整数

    属于对字符串进行操作的问题 百无一用是情深 字符串里有数字,空格,正负号等,需要先过滤出来 在这道题目里,我们通常考虑字符串的组合是 “空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。 for循环

    2024年02月08日
    浏览(39)
  • 力扣刷题第二天 统计整数数目(每天一题)

    统计整数数目 给你两个数字字符串  num1  和  num2  ,以及两个整数  max_sum  和  min_sum  。如果一个整数  x  满足以下条件,我们称它是一个好整数: num1 = x = num2 min_sum = digit_sum(x) = max_sum . 请你返回好整数的数目。答案可能很大,请返回答案对  109 + 7  取余后的结果。 注

    2024年01月16日
    浏览(39)
  • 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日
    浏览(49)
  • leetcode 343.整数拆分 198.打家劫舍(动态规划)

       OJ链接 :leetcode 343.整数拆分 代码:  OJ链接 :198.打家劫舍    代码:

    2024年02月05日
    浏览(49)
  • 力扣--动态规划139.单词的拆分

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

    2024年02月20日
    浏览(42)
  • LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

    题目链接:343. 整数拆分 题目描述: 给定一个正整数  n  ,将其拆分为  k  个  正整数  的和(  k = 2  ),并使这些整数的乘积最大化。 返回  你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 算法分析: 定义dp数组及下标含义: dp[i]表述正整数i拆分成k个正整数

    2024年02月04日
    浏览(42)
  • 算法训练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日
    浏览(41)
  • 【LeetCode题目详解】第九章 动态规划part03 343. 整数拆分 96.不同的二叉搜索树 (day41补)

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

    2024年02月10日
    浏览(46)
  • 我在代码随想录|写代码Day33 | 动态规划| 路径问题| 62.不同路径,63. 不同路径 II,343. 整数拆分

    🔥博客介绍`: 27dCnc 🎥系列专栏: 数据结构与算法 算法入门 C++项目 🎥 当前专栏: 算法入门 专题 : 数据结构帮助小白快速入门算法 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)o .。.:*☆ ❤️感谢大家点赞👍收藏⭐评论✍️ 今日学习打卡 代码随想录 - 动态规划

    2024年03月11日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包