转换为动态编程算法

时间:2019-06-11 09:50:53

标签: c++ algorithm

我找到了一个练习,我必须从一定大小的数组的连续元素中找到最大和。例如,一个9个正元素的数组中5个连续元素的最大和是多少。我读到,这是使用动态编程方法进行最佳优化的。我是c ++的新手,我希望获得一些帮助将我的代码转换为动态编程算法。希望在此过程中我能最终理解它。

这是我的代码:

  int main() 
{

  int arr[9]{10,25,33,14,5,56,27,8,79};
  int array_sums[9]{0};

  for(int i = 0; i < 9; ++i)
  {
    if(i + 4 > 8) { array_sums[i] = 0; }
    else{
      array_sums[i] = arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4];
    }

  }

  int max{0};
  int current_max{0};

  for(int i = 0; i < (sizeof(array_sums)/sizeof(array_sums[0])); ++ i)
  {
    current_max = array_sums[i];
    max = (max < current_max) ? current_max:max;
  }


  cout << "\n" << max;

  return 0;
}

感谢您的帮助和时间!

1 个答案:

答案 0 :(得分:3)

这不是可以通过动态编程进行改进的程序的好示例。因此,我假设您要查找5个连续元素,而不是k个连续元素,在这种情况下,是在第8行而不是

array_sums[i] = arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4];

您将编写如下代码:

for(int j = 0 ; j<k ; j++)   
    array_sums[i] += arr[i+j];

在这种情况下,您的代码应为O(k*n)

现在您可以使用动态编程来改进代码。除了上面的代码,您可以简单地使用如下代码:

if(i == 0)
    for(int j = 0 ; j<k ; j++)   
        array_sums[i] += arr[i+j];
else
    array_sums[i] = array_sums[i-1] - arr[i-1] + arr[i+k-1];

在这种情况下,您的代码应为O(n)