美文网首页算法提高之LeetCode刷题算法LeetCode
整数划分--思考问题背后的数学原理

整数划分--思考问题背后的数学原理

作者: mbinary | 来源:发表于2018-08-29 15:47 被阅读0次

今天在 leetcode 做动态规划的题, 做到一道整数划分的题目如下

Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

Example 1:

Input: 2
Output: 1
Explanation: 2 = 1 + 1, 1 × 1 = 1.

这个用动态规划很容易写出代码如下,

class Solution:
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        self.dic={1:1}
        for i in range(2,n+1):
            mx = 1
            for j in range(1,i):
                prod = j*self.dic[i-j]
                mx =max(mx,prod,j*(i-j))
            self.dic[i] = mx
        return self.dic[n]

后来想到, 这不就是均值不等式吗? 给定和, 求积最大, 即
a_1+a_2 \ldots a_k = \sum_{i=1}^{k}a_i = n,\quad \text{find } max(\prod_{i=1}^{k}a_i)
如果先不考虑整数的话,易知当所有数相等时最大,但是注意这里并不知道数的个数 k, 所以设各个数为 x, 有 n/x个
要求出 x, 可以用导数. 各个数的积即为 x^{\frac{n}{x}}, 求其最大值
f(x) = x^{\frac{n}{x}},\quad x>0
求导得
f'(x) = nx^{\frac{n}{x}-2}(1-lnx)

易知当 x = e 的时候函数 f(x)有最大值

下面考虑整数, x=2 或者 3

即比较 2^{\frac{n}{2}}, 3^{\frac{n}{3}}
的增长速度, 这很简单了, 其实都是指数函数, 换个形式即为
\sqrt{2}^{n}, \sqrt[3]{3}^{n}

由于 n > 0 , 底数大的增长快,

计算得
\sqrt{2} = 1.414, \sqrt[3]{3} = 1.442
所以, 尽量将整数 n 分成 3即可,

于是原题目有了下面的非动态规划解法

class Solution(object):
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n<5:
            return [0, 0, 1, 2, 4][n]
        x = n % 3
        if x == 0:
            return 3 ** (n // 3)
        if x == 1:
            return 3 ** (n // 3 - 1) * 4
        return 3 ** (n // 3) * 2

本来是个很简单的题, 但是给我的感觉就是:
动态规划是种系统的方法, 它依靠计算机的算力对问题直接求解, 不用了解其背后的数学原理.
而有时候, 如果我们跳出常规思维, 思考问题背后的数学规律, 就可能发现更加好的解法. 更加完备,快速, 健壮.

相关文章

  • 整数划分--思考问题背后的数学原理

    今天在 leetcode 做动态规划的题, 做到一道整数划分的题目如下 Given a positive inte...

  • leetcode 题目: 整数划分--思考问题背后的数学原理

    今天在 leetcode 做动态规划的题, 做到一道整数划分的题目如下 Given a positive inte...

  • 整数划分问题

    什么是整数划分?将正整数n表示成一系列正整数的和。例如5的划分:5(1) 5;(2) 4+1;(3) 3+2 3...

  • 整数划分问题

    将一个整数划分为多个整数想加的形式,并计算划分方法。例:6的划分:6=5+16=4+26=4+1+16=3+36=...

  • 整数划分问题

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整...

  • 分治法

    整数划分 所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1...

  • 递归--整数划分问题

    前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 在说到递归算法的时候,逃...

  • NYOJ 90 整数划分

    法一:递归 法二:动态规划 法三:DFS

  • 主题模型LDA理解与应用

    本文主要用于理解主题模型LDA(Latent Dirichlet Allocation)其背后的数学原理及其推导过...

  • 数学之美-读后感

    总体感言 一本不错的信息处理数学原理科普书。一些复杂的信息问题、工程问题,经作者之手,把背后的数学原理通过简单的形...

网友评论

    本文标题:整数划分--思考问题背后的数学原理

    本文链接:https://www.haomeiwen.com/subject/muhkwftx.html