力扣-动态规划-343. 整数拆分

27 篇文章 0 订阅
26 篇文章 0 订阅

力扣-动态规划-343. 整数拆分

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:动态规划

 今天接着刷第五道动态规划的题目,刚看到题目的时候不看分类我们肯定不知道这要用动态规划的思想,于是就先将n从2开始逐渐写下来分析特点,

n23456789
最大乘积1*11*22*22*33*34*32 * 3 * 33 * 3 * 3

 通过总结我们发现,后年的结果能够由前面的结果递推出来,因此自然而然想到了动态规划。
 在正式开始做题之前我们来复习一下动态规划的思路,动态规划思路:
1. 确定dp数组及下标的含义,正整数n可以获得的最大乘积
2. 确定状态转移方程,也就是递推公式。动态规划的特点是前面的决策会影响到后面的决策,前面不同的决策会影响后面的结果。本题中从i=4开始
dp[i] = max(dp[i-j]*dp[j]),j从1开始遍历到i/2;
3. dp数组初始化,本题比较特殊的地方在于n为2和3时,不在递推公式范围之内,直接返回对应的1和2,当n从4开始就满足递推公式,而从n=4开始dp[2]=2,dp[3]=3,这样才能用递推公式进行下去。
4. 遍历顺序,对i从4到n逐渐遍历
5. 举例推导dp,与代码结果比较。
 我自己写的代码如下,代码已经加了注释,各位小伙伴如果有什么问题可以在评论里提出来,欢迎大家交流。

//动态规划 前面的状态会影响到后面的决策
    //动态规划 
    //1.dp[i]代表数字i最大的乘积
    //2.地推公式 dp[i] = dp[j] * max(dp[i-j,i-j,i-j],,,,) i为2、3时单独计算
    //3.初始化 初始化i为2、3的情况
    //4 遍历顺序 i从小到大遍历 从4开始遍历
    //举例推导
    public int integerBreak(int n) {
        if (n == 2) {
            return 1;
        } 
        if (n == 3){
            return 2;
        }
        int[] dp = new int[n + 1];
        dp[2] = 2;
        dp[3] = 3;
        int max = 0;
        for (int i = 4; i <= n; i++) {
            for (int j = 2; j <= i/2; j++) {
                int temp = dp[i - j] * dp[j];
                //System.out.println("dp[" + (i - j) + "]: " + dp[i - j] + "  dp[" + j + "]: " + dp[j]);
                if (temp > max) {
                    max = temp;
                }                
            }
            dp[i] = max;
            //System.out.println("dp[" + i + "]: " + dp[i]);
            max = 0;           
        }                    
        return dp[n];
    }

另外附上我自己搭建的个人博客网址,里面记录了我之前记录的学习心得,欢迎大家交流讨论。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值