zoukankan      html  css  js  c++  java
  • 343. 整数拆分

    方法一:动态规划

    对于的正整数 (n),当 (n ge 2) 时,可以拆分成至少两个正整数的和。令 (k) 是拆分出的第一个正整数,则剩下的部分是 (n-k)(n-k) 可以不继续拆分,或者继续拆分成至少两个正整数的和。由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。

    创建数组 ( extit{dp}),其中 ( extit{dp}[i]) 表示将正整数 (i) 拆分成至少两个正整数的和之后,这些正整数的最大乘积。特别地,(0) 不是正整数,(1) 是最小的正整数,(0)(1) 都不能拆分,因此 ( extit{dp}[0]= extit{dp}[1]=0)

    (i ge 2) 时,假设对正整数 (i) 拆分出的第一个正整数是 (j)(1 le j < i)),则有以下两种方案:

    (i) 拆分成 (j)(i-j) 的和,且 (i-j) 不再拆分成多个正整数,此时的乘积是 (j imes (i-j))

    (i) 拆分成 (j)(i-j) 的和,且 (i-j) 继续拆分成多个正整数,此时的乘积是 (j imes extit{dp}[i-j])

    因此,当 (j) 固定时,有 ( extit{dp}[i]=max(j imes (i-j), j imes extit{dp}[i-j]))。由于 (j) 的取值范围是 (1)(i-1),需要遍历所有的 (j) 得到 ( extit{dp}[i]) 的最大值,因此可以得到状态转移方程如下:

    [ extit{dp}[i]=mathop{max}limits_{1 le j < i}{max(j imes (i-j), j imes extit{dp}[i-j])} ]

    最终得到 ( extit{dp}[n]) 的值即为将正整数 (n) 拆分成至少两个正整数的和之后,这些正整数的最大乘积。

    class Solution {
    public:
        int integerBreak(int n) {
            vector<int> f(n + 1);
            for (int i = 2; i <= n; i++)
                for (int j = 1; j < i; j++)
                    f[i] = max(f[i], max(j * (i - j), j * f[i - j]));
            
            return f[n];
        }
    };
    
  • 相关阅读:
    Button 样式设置
    WPF 运行报错:在使用 ItemsSource 之前,项集合必须为空。
    c# List 按条件查找、删除
    c# WPF DataGrid设置一列自增一
    C# WPF DataGrid去掉最左侧自动生成一列
    int 转换成定长的 byte数组
    字节数组 byte[] 与 int型数字的相互转换
    [ c# ] int 类型转换为固定长度的字符串
    ListView 绑定 字典
    不能引用的文件,却需要在程序底层使用的文件 的存放位置
  • 原文地址:https://www.cnblogs.com/fxh0707/p/15038985.html
Copyright © 2011-2022 走看看