请问这两个memo[i]有什么区别?为什么要这样写?比如i=2时,右边那个memo[i]不是没有初值吗?怎么比较?

来源:9-3 发现重叠子问题 Integer Break

蒙特卡洛

2019-07-23

图片描述

写回答

3回答

蒙特卡洛

提问者

2019-07-24

//img.mukewang.com/szimg/5d38539309b42b4b03710322.jpg

//img.mukewang.com/szimg/5d38539409529a6705370667.jpg

我参考的剑指OFFER上的

老师它这里两边都相当于考虑用memo[i]来计算,所以只需要分解一半就行了,但是我没懂得是它这里为什么只需要比较max和每次计算出的product[j]*product[i-j]的大小,不需要考虑和j*(i-j)比较大小了吗?

而且我单步debug出来的长度为4时,最大乘积应该为4(2*2),它这样算出来就是3了。

0
6
蒙特卡洛
回复
liuyubobobo
非常感谢
2019-07-25
共6条回复

liuyubobobo

2019-07-24

在Java语言中,int的初始值是0。new 完整个数组空间,所有的数都是0。打印出来试试看?


memo[i - j] 并没有重新算。最外层对 i 的for循环,每一次都会决定好一个memo[i]的值,之后,就记录在memo[i]了。之后,计算更大的memo[i]的时候,i - j 一定是比当前的 i 小,所以memo[i - j] 一定已经计算完了,直接拿出来就用了。注意,memo[i - j] 这个写法就是取出 memo 数组中 i - j 位置的结果而已,不涉及其他计算。


强烈建议使用一个小数据,比如 n = 10,实际跟踪一下整个算法,看一下整个算法到底是怎么计算出每一个memo[i] 的?


对于那句max3,代码太压缩,可能不好跟踪,可以替换成下面的样子,实际看一下在每次内层循环中,a,b,c都是谁?为什么是这些数字?最后决定了memo[i]是多少?

for(int i = 2; i <= n; i ++)
    // 求解 memo[i]
    for(int j = 1; j <= i; j ++){
        int a = memo[i];
        int b = j * (i - j);
        int c = j * memo[i - j]; // 在这里一定要看一下 memo[i - j] 是多少?为什么?
        memo[i] = max3(a, b, c);
    }


继续加油!:)

0
3
蒙特卡洛
老师我还有个问题写在回复里面了,麻烦你看看
2019-07-24
共3条回复

蒙特卡洛

提问者

2019-07-23

还有这里并没有单独保存memo[i]的值,那么后面当i++后算memo[i-j]的值不是要重新算吗?怎么直接用之前已经算了的memo[i]呢?比较晕........请老师讲解一下

0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程