chapter_greedy/max_product_cutting_problem/ #643
Replies: 17 comments 21 replies
-
Enhanced security |
Beta Was this translation helpful? Give feedback.
-
动态规划,对比一下就可以看出贪心的效率了 public static int dpMultiply(int num)
{
int[] max = new int[num + 1];
// 初始化,0和1都无法分割,为0
max[0] = 0;
max[1] = 0;
for (int i = 2; i <= num; i++)
{
// 第一次分割长度
for (int len = 1; len <= i / 2; len++)
{
int temp = Math.max(len * (i - len), len * max[i - len]);
max[i] = Math.max(temp, max[i]);
}
}
return max[num];
} |
Beta Was this translation helpful? Give feedback.
-
我还在想条件不是 |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
求问"假设从n中分出一个因子2,则它们的乘积为 2*(n-2)。我们将该乘积与n作比较:"。🤔为啥上来就想到分一个因子2而不是其他的,从而推出n>=4还要继续分的 |
Beta Was this translation helpful? Give feedback.
-
数学这玩意你知道别人是怎么想到一些定理的吗?一样的道理,灵感罢了
|
Beta Was this translation helpful? Give feedback.
-
你说的第一句怎么说呢,数学最忌讳这么说了。
… 根据对数学运算的理解,我们认为 n * m > n + m 通常是成立的,且 n 和 m 越大,这个不等式就更有可能成立。从这个角度思考,用因子 2 来分析是最合适的,因为它能覆盖到最广的情况。如果用更大的因子 3, 4, 5, ... 来分析也行,但最后你还是会发现 2 * 2 = 4 ,即因子 4 也可以再分。
|
Beta Was this translation helpful? Give feedback.
-
小白尝试证明一下,勿喷哈哈 |
Beta Was this translation helpful? Give feedback.
-
k神,我有个疑问,三种幂函数的时间复杂度不应该都是O(logn)吗?如果是指调用函数的时间,我直接用内置的pow函数不是比用math库调pow函数更快嘛 |
Beta Was this translation helpful? Give feedback.
-
我的思路是先尝试对半分,然后从(n^2/4-n=0)的解想到了小于等于四都要切分,但没想到替换成3,TUT |
Beta Was this translation helpful? Give feedback.
-
“这说明大于等于4的整数都应该被切分”, 先分析出子问题 |
Beta Was this translation helpful? Give feedback.
-
在考虑只分一次时,分1就变小。分的数x全一样时用函数画图分析可得n大于e时分的数乘积才能变大,且x大于e,x取3能使乘积最大。n小于4不够分,n=4分一个x=3会出现1变小,发现lnx/x函数在2和4的值一样,故选择妥协不要3了,选择两个2起码不变小,n=5分一个3虽然没满足分的数全为3,不过剩下的2起码不是1,能变大。从而分解出子问题。 |
Beta Was this translation helpful? Give feedback.
-
这里有点蒙,先看评论区 |
Beta Was this translation helpful? Give feedback.
-
def maxProduct(n: int) -> int:
|
Beta Was this translation helpful? Give feedback.
-
对于正整数 n,其各部分之和为 n,乘积最大时(在连续情况下)各部分应尽量相等。根据均值不等式(AM–GM不等式),当 k 个正数的和固定时,它们的乘积在这 k 个数全部相等时达到最大值。 如果允许实数,则最佳划分的每个数为 n/k,使得乘积
|
Beta Was this translation helpful? Give feedback.
-
K大,本节结尾的正确性证明中,
是否应该改为 “只分析 n >= 4 的情况”,因为 n == 3 时,由于题目要求至少将 n 切分为两个正整数,所以此时应该切分为 1 * 2 ,切分方案里是包含 1 的 😁;
最后半句改为“从而获得更大或可替代的乘积”是否更好,因为当切分方案中存在 4 作为因子时,将其划分为 2 * 2,乘积相对划分前是相等的。不过这处改动不影响“所有因子 <= 3” 的结论,因为因子 4 是可以被替代的。 |
Beta Was this translation helpful? Give feedback.
-
私认为以$3$为主要的“切分因子”这一部分应该这么解释比较好: 先去掉正整数的限制,在$m$和各$n_i$均可取正实数时使用AM-GM,可知乘积$\displaystyle \prod_{i=1}^m{n_i}\leq\left(\frac{\sum_{i=1}^m}{m}\right)^m=\left(\frac{n}{m}\right)^m$,该最大值在$\displaystyle \left(\frac{n}{m}\right)^m$在各$n_i$均相等时取得。现设法令该最大值再取得最大,只需令$\displaystyle \left(\frac{n}{m}\right)^m$对$m$求导,得$\displaystyle m=\frac{n}{e}$为该函数的最大值点,此时最大值为$\displaystyle e^{\frac{n}{e}}$,各$n_i$应当都取为$e$。 有了上面正实数情况下的指引,我们不难猜测,正整数情况下的最优解就在上面的实数解附近。
有了这两条准则,后面就跟正文中的做法大同小异了。我们“贪心”地在$n$中划分出尽可能多的$3$,然后考察除$3$后的余数:
最后,值得一提的是,上面推理得到第二条结论的过程不够严谨。我们实际上不应该考察$\displaystyle m=\frac{n}{3}$和$\displaystyle m=\frac{n}{2}$,因为这两者有可能不为整数,而应当考察两个最靠近$\displaystyle \frac{n}{e}$的整数$\displaystyle m=\lfloor\frac{n}{e}\rfloor$ 和$\displaystyle m=\lceil\frac{n}{e}\rceil$。但要这么做的话,后面的结论推导会变得相当复杂。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
chapter_greedy/max_product_cutting_problem/
动画图解、一键运行的数据结构与算法教程
https://www.hello-algo.com/chapter_greedy/max_product_cutting_problem/
Beta Was this translation helpful? Give feedback.
All reactions