从递归解决方案构建最大子数组动态编程解决方案

时间:2019-09-02 04:07:55

标签: java dynamic-programming

在考虑递归实现之前,我设法通过动态编程解决了最大子数组问题,但是,由于我遇到了更复杂的动态编程问题,因此我决定研究基础知识,例如查看正在实现的递归解决方案,然后对其进行转换。变成动态的。

我拥有的动态编程解决方案如下:

lasso.mod$a0
#          s0 
# -0.08847216 

当我开始考虑递归实现时,似乎无法找到导致这种逻辑的正确方法。我想出的唯一递归解决方案是将数组拆分为小节:

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;

涉及一个附加的基本求和方法。有人可以显示出导致动态编程解决方案的递归实现吗?

1 个答案:

答案 0 :(得分:2)

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

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);
  }
}

查看实际操作:http://ideone.com/qvs1lJ