【发布时间】:2019-05-17 04:27:37
【问题描述】:
我正在尝试为 codeChef 的问题Bytelandian gold coins 编写代码。该代码适用于n < 10^7,但会为更高的值提供分段错误。我找了datatypes which could hold bigger numbers,但这也没有用。我当然认为我的代码没有问题,但递归树可能变得太大而编译器无法处理。这是代码。
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
lli divide(lli n, lli dp[])
{
lli ans = 0;
if (n == 0)
return 0;
if (dp[n] != 0)
return dp[n];
lli m1 = floor(divide(n / 2, dp));
lli m2 = floor(divide(n / 3, dp));
lli m3 = floor(divide(n / 4, dp));
lli sum = m1 + m2 + m3;
ans = max(sum, n);
dp[n] = ans;
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
lli n;
cin >> n;
lli dp[n + 1] = { 0 };
lli ans = divide(n, dp);
cout << ans << endl;
}
}
【问题讨论】:
-
你有没有想过计算机拥有无限的资源?
-
VLA(可变长度数组)是 C 特性,而不是合法的 C++。你溢出了堆栈。使用
std::vector<lli>。<bits/stdc++.h>也不是标准标题,应该避免使用。 -
lli dp[n + 1] = {0};-- 一行代码中的竞争性编码废话。疯狂的宏、非标准的 VLA 使用等 -
@Abhishek 任何递归函数如果不限制调用次数,最终都会耗尽堆栈空间,而 10^7 是找到该限制的好方法。
-
网站上提到N可以达到10^9。恐怕算法层面还得做一些额外的工作