忍者训练中的 StackOverflowError

问题描述 投票:0回答:0

我一直在尝试解决代码工作室的“忍者训练问题”。

问题是:

Ninja 正在计划这个“N”天的训练计划。每天,他可以进行这三项活动中的任何一项。 (跑步、格斗练习或学习新动作)。每项活动每天都有一些功绩点。由于 Ninja 必须提高他所有的技能,他不能连续两天做同样的活动。你的任务是计算忍者可以获得的最大功德点数。

3
[10 40 70]
[20 50 80]
[30 60 90]

O/P: 210 

约束: 1<=N<=10000 1<=A[i]<=100

我的代码: 递归+记忆。

  1. 我使用了自上而下的方法。
  2. 对于每个索引,我将返回该索引的子问题的最大优点点。
  3. 使用记忆将其保存以备后用。
public static int helper(int rowi, int coli, int points[][], int n, int[][] dp){
        if(rowi>=n || coli>3) return 0;
        //
        if(dp[rowi][coli]!=-1) return dp[rowi][coli];
        int max=0;
   
        for(int i=0; i<3; i++){
            if(i!=coli){
                int val=points[rowi][i]+helper(rowi+1, i, points, n, dp);
                max=Math.max(max, val);
            } 
        }
        return dp[rowi][coli]= max;
    }

司机代码:

public static int ninjaTraining(int n, int points[][]) {
        // Write your code here..
        int[][] dp=new int[n][4];
        for(int[] a:  dp) Arrays.fill(a, -1);
        return helper(0, 3, points, n, dp);
    }

幸运的是,我的代码通过了 11 个测试用例中的 9 个。但是,它在递归调用中抛出“StackOverFlow 错误”。我尝试了所有方法来消除错误。请帮我解决这个问题。

错误:

Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper( Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20)在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution.java:20) 在 Solution.helper(Solution .java:20) 在 Solution.helper(Solution.java:20)

java recursion dynamic-programming memoization
© www.soinside.com 2019 - 2024. All rights reserved.