我编写它的目的是一次可以处理一个测试用例。 在线法官花费的时间太长,或者返回错误的答案
来源:我曾经在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";
}
答案 0 :(得分:1)
您说过,它在很小的情况下都可以工作。.可能是堆栈溢出..
函数调用会消耗堆栈内存。
如果递归调用深度太深,则堆栈内存将耗尽,并崩溃。.
答案 1 :(得分:0)
当您从int n
读取std::cin
值时,必须为数组arr
动态分配内存,因此应首先声明int *arr
,然后获取用户输入就像现在一样,然后使用arr = new int[n]
分配内存。
使用递归函数来计算下一个值需要很长时间时,您应该考虑重新构造函数以使用尾递归,它更接近于迭代。您可以通过编写两个用于计算斐波纳契数的程序来检查差异(一个程序是递归的,另一个程序是迭代的),然后检查使用这两种方法计算〜50值所需的时间。