为什么我的递归最长增长子序列函数不能用于大输入?

时间:2019-11-23 16:03:13

标签: c++ dynamic-programming

我编写它的目的是一次可以处理一个测试用例。 在线法官花费的时间太长,或者返回错误的答案

来源:我曾经在problem上进行过测试

它非常适合小情况:

#include <iostream>
  #include <algorithm>
  #include <vector>
  int LIS[100000];
  void LS (int *arr , int n)
  {
      if (n == 0)
      {
          LIS[0] = 1;
          return;
      }
      if (LIS[n])
      {
          return;
      }
      int i = 0;
      int max = 0;
      while (i < n)
      {
          if (arr[i] < arr[n])
          {
              LS(arr,i);
              if (LIS[i] + 1 > max)
              {
                  max = 1 + LIS[i];
              }
          }
          ++i;
      }
      LIS[n] = max;

  }
  int main()
  {
      int n;
      std::cin >> n;
      int arr[n];
      for(int i = 0 ; i < n ; ++i) std::cin >> arr[i];
      LS(arr,n-1);
      std::sort (LIS , LIS+n);
      std::cout << "\n" << LIS[n-1] << "\n";
  }

2 个答案:

答案 0 :(得分:1)

您说过,它在很小的情况下都可以工作。.可能是堆栈溢出..

函数调用会消耗堆栈内存。

如果递归调用深度太深,则堆栈内存将耗尽,并崩溃。.

答案 1 :(得分:0)

当您从int n读取std::cin值时,必须为数组arr动态分配内存,因此应首先声明int *arr,然后获取用户输入就像现在一样,然后使用arr = new int[n]分配内存。

使用递归函数来计算下一个值需要很长时间时,您应该考虑重新构造函数以使用尾递归,它更接近于迭代。您可以通过编写两个用于计算斐波纳契数的程序来检查差异(一个程序是递归的,另一个程序是迭代的),然后检查使用这两种方法计算〜50值所需的时间。