Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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_Dynamic Programming - Fatal编程技术网

Java 由递归解构造最大子阵动态规划解

Java 由递归解构造最大子阵动态规划解,java,dynamic-programming,Java,Dynamic Programming,在考虑递归实现之前,我设法用动态规划解决了最大子阵列问题,然而,由于我在与更复杂的动态规划问题作斗争,我决定研究一些基础知识,比如看到我正在实现的递归解,然后将其转换为动态解 我的动态规划解决方案如下: int[] dp = new int[arr.length]; if (arr.length == 0) { return 0; } //initialize dp[0] = Math.max(0, arr[0]); int max = dp[0]; for (int i

在考虑递归实现之前,我设法用动态规划解决了最大子阵列问题,然而,由于我在与更复杂的动态规划问题作斗争,我决定研究一些基础知识,比如看到我正在实现的递归解,然后将其转换为动态解

我的动态规划解决方案如下:

int[] dp = new int[arr.length];

if (arr.length == 0)
{
        return 0;
}

//initialize
dp[0] = Math.max(0, arr[0]);
int max = dp[0];

for (int i = 1; i < arr.length; i++)
{
    dp[i] = Math.max(0, arr[i] + dp[i - 1]);

    if (dp[i] > max)
    {
        max = dp[i];
    }
}

return max;

这涉及到一个附加的初等求和方法。有人可以展示导致动态规划解决方案的递归实现吗?

您的arr像一个全局变量一样工作,因此我们只能将其用作参数。 您的dp是一个辅助变量,是下一次迭代的轴心。 您的max是一个可变目标。 所有工作均在以下位置完成:

pivot = Math.max(0, arr[i] + pivot);
if (pivot >= max){
  max = pivot;
}
所以你可以试试这个:

private static int resolveR(int i, int max, int pivot, int[] arr){
  //initialize
  if (i == arr.length){
    return max;
  } else {
    pivot = Math.max(0, arr[i] + pivot);
    if (pivot >= max){
        max = pivot;
    }
    return resolveR(i+1, max, pivot, arr);
  }
}

请参见此处的操作:

您的arr与全局变量类似,因此我们只能将其用作参数。 您的dp是一个辅助变量,是下一次迭代的轴心。 您的max是一个可变目标。 所有工作均在以下位置完成:

pivot = Math.max(0, arr[i] + pivot);
if (pivot >= max){
  max = pivot;
}
所以你可以试试这个:

private static int resolveR(int i, int max, int pivot, int[] arr){
  //initialize
  if (i == arr.length){
    return max;
  } else {
    pivot = Math.max(0, arr[i] + pivot);
    if (pivot >= max){
        max = pivot;
    }
    return resolveR(i+1, max, pivot, arr);
  }
}

请参见此处的操作:

这一行:
dp[i]=Math.max(0,arr[i]+dp[i-1])应该是
dp[i]=Math.max(*max*,arr[i]+dp[i-1])。我编写此代码是为了在最大和为负时返回0。在此行中:
dp[I]=Math.max(0,arr[I]+dp[I-1])应该是
dp[i]=Math.max(*max*,arr[i]+dp[i-1])。我编写此代码是为了在最大和为负时返回0。