LeetCode343整数拆分(动态规划)

原理

  1. 问题分析与状态定义
    • 题目要求将一个正整数 n 拆分成至少两个正整数的和,然后求这些正整数的最大乘积。定义状态 dp[i] 表示将整数 i 拆分后得到的最大乘积。
    • 对于整数 i,我们可以尝试将其拆分成 j 和 i - j 两部分(其中 j 的取值范围是从 1 到 i - 1),然后对于 i - j 这部分,它又有两种情况:一是不再继续拆分,直接就是 i - j;二是继续拆分,其最大乘积就是 dp[i - j]。所以我们需要比较这几种情况乘积的大小,取最大值作为 dp[i] 的值,由此得到状态转移方程。
  2. 边界条件确定
    • 当 n = 2 时,因为至少要拆分成两个正整数,只能拆分成 1 + 1,其乘积为 1,所以 dp[2] = 1,这是后续动态规划计算的起始边界值。

步骤

  1. 动态规划数组初始化
    • 创建一个大小为 n + 1 的 vector 数组 dp,用于存储将每个整数从 2 到 n 拆分后能得到的最大乘积,并将 dp[2] 初始化为 1,作为边界条件。
  2. 动态规划计算
    • 通过外层循环从 3 开始遍历到 n,对于每一个整数 i(表示当前要处理的整数),使用内层循环从 1 到 i - 1 遍历,尝试将 i 拆分成 j 和 i - j 两部分(j 为拆分出来的其中一个数)。
    • 对于每一种拆分情况,计算三种可能乘积中的最大值来更新 dp[i]
      • 第一种是 j * (i - j),表示 i - j 这部分不再拆分,直接计算它们的乘积。
      • 第二种是 j * dp[i - j],表示 i - j 这部分继续拆分,其最大乘积为 dp[i - j],再与 j 相乘。
      • 然后取这两种情况以及当前 dp[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值