Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在我的代码中使用备忘录?_Java_Algorithm_Dynamic Programming_Memoization - Fatal编程技术网

Java 如何在我的代码中使用备忘录?

Java 如何在我的代码中使用备忘录?,java,algorithm,dynamic-programming,memoization,Java,Algorithm,Dynamic Programming,Memoization,我有一个问题陈述如下: 你是一名职业抢劫犯,计划抢劫街道两旁的房屋。每间房子都有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子都连接了安全系统,如果两间相邻的房子在同一晚被闯入,它会自动联系警察 给出一个代表每家每户金额的非负整数列表,确定今晚在不报警的情况下可以抢劫的最大金额 我正在用Java编写代码。我使用动态规划来解决这个问题,代码给出了正确的解决方案。但是,代码效率不高,因为我使用递归,而不是使用记忆来解决问题。如何在代码中使用备忘录的概念来提高代码的效率?这是我的密码: cla

我有一个问题陈述如下: 你是一名职业抢劫犯,计划抢劫街道两旁的房屋。每间房子都有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子都连接了安全系统,如果两间相邻的房子在同一晚被闯入,它会自动联系警察

给出一个代表每家每户金额的非负整数列表,确定今晚在不报警的情况下可以抢劫的最大金额

我正在用Java编写代码。我使用动态规划来解决这个问题,代码给出了正确的解决方案。但是,代码效率不高,因为我使用递归,而不是使用记忆来解决问题。如何在代码中使用备忘录的概念来提高代码的效率?这是我的密码:

class Solution {

    public int rob(int[] nums) {
        return robmax(nums,nums.length-1);    
    }

    public int robmax(int[] nums,int n) {
        int max = 0;
        if(nums.length==0) return 0;
        if(n==1) return Math.max(nums[0],nums[1]);
        if(n==0) return nums[0];
        else{
            max = Math.max(nums[n]+robmax(nums,n-2),robmax(nums,n-1));
        }
        return max;
    }
}

另外,我的算法的运行时复杂性是多少

解决这个问题不需要记忆, 或递归调用。 一个动态规划解决方案将很好地工作,并且简单得多。 您可以在元素的单次传递中找到解决方案。 考虑该算法:

  • max
    初始化为0
  • 对于每套房子,您最多可以抢劫:
    • 截至
      房屋[i-2]
      的最大值+当前房屋的价值
    • 截至
      房屋[i-1]
也就是说,跟踪前一个房子的已知最大值,以及前一个。 当你到达最后一所房子时,你将拥有累计的最大金额。 以下是提纲,我希望我不会破坏练习:

public int rob(int[] nums) {
    int max = 0;
    int prev = 0;
    int prevprev = 0;
    for (int current : nums) {
        // TODO: 3 lines to solve the puzzle
    }
    return max;
}   

n
值的数组
memo
初始化为-1以表示数组中没有任何内容。函数的第一行应该检查
memo[n]
是否<0,如果是,则执行该操作。最后一行应该返回
memo[n]
。然后修改函数,将计算结果存储在
memo[n]
中。至于你的复杂性,我相信你的原始形式是
O(phi^n)
其中
phi=1.618..
。有关原因,请参见关于斐波那契级数的讨论。对于记忆表格,你自己试试。你试过什么?我觉得现在大多数问题都是人们的家庭作业……你想记住什么?这是交给我的任务。我同意。我差点把这个贴出来。但这不是OP的问题,我想用备忘录。您的解决方案只使用dp。无论如何Thanks@user45437很公平。我担心的是,由于内存需求(
O(n)
而不是最佳的
O(1)
),记忆解决方案不会给出通过的结果。其他人已经在评论中给了你一个回忆录策略,所以如果我现在把它添加到我的答案中是不合适的。我知道这不是你想要的,没关系。