DAY44:动态规划(四)整数拆分(递归+DP递推都可以做,注意区别和理解)

文章讨论了如何解决343.整数拆分问题,通过递归法和动态规划两种策略,分析了两种方法的思路、代码实现以及性能优化。递归法中,通过记忆化搜索避免重复计算,动态规划则利用状态转移方程从下至上计算最大乘积。两种方法的时间复杂度均为O(n²),但动态规划通常更节省空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路1:递归法(最直观的想法)

这个问题的目标是找出一个整数n的最大乘积,通过将其拆分为至少两个正整数的和。也就是说,可以出现多个正整数的情况。

递归思路

最直观的思路,我们要找的是一个整数n的最大乘积,可以将这个整数拆分为i和n-i(1 <= i < n)。对于每个i,我们可以选择将n-i继续拆分,也可以选择不再拆分。如果只拆成两个,就是i*(n-i)。如果拆成多个,就是i*dfs(n-i)

所以对于每个i,我们需要比较i*(n-i)i*dfs(n-i)的值,取所有结果中的最大值

普通递归写法

  • 注意找result的最大值,max的比较里一定要加上result本身,要存储for循环遍历中所有的最大值
  • 注意(n-i)这样的情况要加括号,不然会发生逻辑错误
class Solution {
   
public:
    int dfs(int n){
   
        //递归终止条件:输入为1,也就是已经拆到1了,直接返回
        if(n==1) return 1;
        int result=0;
        for(int i=1;i<n;i++){
   
            //(n-i)加括号
            result = max(result,max(i*(n-i),i*dfs(n-i)));//找到result的最大值,i*n-i是拆两个,i*dfs(n-i)是拆多个
        }
        return result;
    }
    int integerBreak(int n) {
   
		return dfs(n);
    }
};
注意点:max的嵌套

max()函数在c++标准库中定义的版本只接受两个参数。也就是说max()函数在每次调用时只比较两个值,因此,如果要比较三个或更多的值,需要将max()函数嵌套在一起使用。例如下面:

result = max(result,max(i*n-i,i*dfs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值