验证码:强盗,使用递归+备忘录

Kenpeter

我正在看这个讨论

步骤4

迭代+备注(自下而上)

public int rob(int[] nums) {
    if (nums.length == 0) return 0;
    int[] memo = new int[nums.length + 1];
    memo[0] = 0;
    memo[1] = nums[0];
    for (int i = 1; i < nums.length; i++) {
        int val = nums[i];
        memo[i+1] = Math.max(memo[i], memo[i-1] + val);
    }
    return memo[nums.length];
}

问题:

  • 是否memo[i]意味着抢劫非流动房屋?

  • 是否memo[i-1] + val意味着抢劫当前房屋?

  • 我正在阅读步骤3并找到以下内容:memo[i] = Math.max(rob(nums, i - 2) + nums[i], rob(nums, i - 1));我有点困惑memo[i+1] = Math.max(memo[i], memo[i-1] + val);

吉拉德·巴坎(Gilad Barkan)

memo本身并不存储任何特定的决定。而是将最佳解决方案存储到i第一个元素,即动态程序的核心由于已将其分配给memo[i+1],因此在memo[i]之间的选择memo[i-1] + val可以被认为是最(i-1)合适的房屋(因此不抢劫房屋i),或者,如果我们要抢劫房屋,那么我们必须跳过房屋,所以让我们把抢劫行为加至(i-2)屋子尽头(请注意,这memo[i+1]是目前为止最好的i房子,这memo[i-1]也是目前为止最好的(i-2)房子。这是为了方便处理第一间房子,这是一种边缘情况。)

这也应该给您一个提示,让您了解如何理解自上而下的递归-同样,如果我们选择抢劫,我们需要将其添加到跳过前身的最佳解决方案中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用反应备忘录

对TypeScript的类使用备忘录

使用备忘录加载当前缓存

递归备忘录解决方案以解决“计数更改”

在underscore.js中使用备忘录功能

使用React备忘录动态更改样式

使用备忘录反应嵌套对象状态

使用备忘录反应嵌套对象状态

使用备忘录反应嵌套对象状态

如何使用备忘录优化React Hooks中的代码

如果缺少道具,我应该使用备忘录吗?

备忘录不使用 Java 中的撤消更新状态

可以在没有箭头功能的情况下反应本机备忘录或使用备忘录吗?

如何将备忘录应用于此递归函数?

将备忘录添加到递归定义的haskell函数

SICP练习3.52:使用Scheme(Guile)是否需要备忘录处理?

备忘录功能可以使用ES6 Map与哈希表吗?

闪亮的应用程序-使用备忘录来缓存R值

如何使用JavaScript中的“纯”函数式编程实现备忘录

什么时候不应该使用React备忘录?

如何在Swift中使用多个参数制作通用备忘录功能?

使用React钩子和备忘录时,如何防止子组件重新渲染?

如何使用有用的备忘录创建 UFW 规则?

如何在Data.Function.Memoize中使用备忘录功能

在 nextjs 中使用备忘录避免不必要的组件渲染

RequestStore与备忘录

使用实例变量/函数属性来实现备忘录与传递每次调用中的备忘录相比有什么需要或好处?

使用WPF C#在Access数据库中插入字符串,日期和备忘录值

尽管使用了备忘录并且未更改任何道具,但仍在功能组件中反应了重新渲染子级