LeetCode-343.整数拆分、记忆化递归

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。
力扣(LeetCode)第343题

题目分析

①.暴力枚举
一个正整数 n 拆分成两个数,可用枚举所有情况,1+n-1、2+n-2、…、i+(n-i) 、(n-1)+1,比较每种情况相乘的结果即最终的值;对于每种情况:i+(n-i),比较 (n-i) 和 (n-i) 继续拆分得到值的大小来确定是否拆分。
在这里插入图片描述
②.map 优化
对于每种情况 i+(n-i) 求解的过程中,都会对 n-i … 1 的所有整数的拆分进行求解,因此递归过程存在重复计算,可以用 map 保存过程中的值,即记忆化搜索。

代码示例

class Solution {
public:
    unordered_map<int,int> mp;//建立备忘录,用于记忆化搜索
    int integerBreak(int n) {
        mp[1] = 1;//初始化
        mp[2] = 1;
        return dp(n);    
    }
    int dp(int n)
{
        int res = 0;
        if( mp.find(n) != mp.end())
        {
            return mp[n];//备忘录中存在,直接返回结果
        }
        for(int i = 1;i < n;i++)//枚举所有情况
        {
            int temp = max(i*(n-i),i*dp(n-i));//判断是否继续拆分
            res = max(res,temp);
        }
        mp[n] = res;
        return res;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值