栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022.01.12 - SX10-08.整数拆分

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022.01.12 - SX10-08.整数拆分

文章目录

1. 题目2. 思路

(1) 数学法(2) 动态规划 3. 代码

1. 题目

2. 思路 (1) 数学法

根据数学规律,将整数尽量拆分成3时的乘积最大,拆分的结果有三种:

    余数为1:将最后一个3与1合并成4,然后连乘。余数为2:正常连乘;余数为0:正常连乘。
(2) 动态规划

对于整数i,可以拆分成j和i-j,其局部最大乘积=max(j*(i-j),j*dp[i-j]),因此,从1遍历到i-1,即可得到整数i的全局最大乘积dp[i]。 3. 代码

public class Test {
    public static void main(String[] args) {
    }
}

class Solution {
    public int integerBreak(int n) {
        if (n <= 3) {
            return n - 1;
        }
        int a = n / 3;
        int b = n % 3;
        if (b == 1) {
            return (int) Math.pow(3, a - 1) * 4;
        } else if (b == 2) {
            return (int) Math.pow(3, a) * 2;
        } else {
            return (int) Math.pow(3, a);
        }
    }
}

class Solution1 {
    public int integerBreak(int n) {
        if (n <= 3) {
            return n - 1;
        }
        int[] dp = new int[n + 1];
        dp[2] = 1;
        dp[3] = 2;
        for (int i = 4; i <= n; i++) {
            int max = Integer.MIN_VALUE;
            for (int j = 1; j < i; j++) {
                max = Math.max(max, Math.max(j * (i - j), j * dp[i - j]));
            }
            dp[i] = max;
        }
        return dp[n];
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号