问题描述
我正在解决关于 codeforces 的竞争性编程 question。我的 code 在那里被接受,但它在我的本地计算机中出现分段错误。为什么会这样?
我还尝试了其他在线编译器,如 ideone ,它也可以在那里工作。
我的操作系统是 Ubuntu 20.04
我的代码:
#include <bits/stdc++.h>
using namespace std;
int M = 1000000007;
int val[1001][1001];
int n,k;
int dp(int cur,int rem)
{
if(cur<1 || cur>k || rem<0 || rem>n)return 0;
if(cur==1 || rem==0)return 1;
if(val[cur][rem]==-1)
{
int ans=0;
ans+=dp(cur,rem-1);
ans%=M;
ans+=dp(cur-1,n-rem);
ans%=M;
val[cur][rem]=ans;
}
return val[cur][rem];
}
void solve()
{
cin>>n>>k;
for(int i=0;i<=k;i++)for(int j=0;j<=n;j++)val[i][j]=-1;
cout<<dp(k,n);
cout<<"\n";
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int _t=1;
cin>>_t;
for (int i=1;i<=_t;i++)
{
solve();
}
return 0;
}
解决方法
事实证明,我的筹码量更小。我使用这个 stackoverflow answer 来修改我的代码。这是正确的代码:
#include <sys/resource.h>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
int M = 1000000007;
int val[1001][1001];
int n,k;
int dp(int cur,int rem)
{
if(cur<1 || cur>k || rem<0 || rem>n)return 0;
if(cur==1 || rem==0)return 1;
if(val[cur][rem]==-1)
{
int ans=0;
ans+=dp(cur,rem-1);
ans%=M;
ans+=dp(cur-1,n-rem);
ans%=M;
val[cur][rem]=ans;
}
return val[cur][rem];
}
void solve()
{
cin>>n>>k;
for(int i=0;i<=k;i++)for(int j=0;j<=n;j++)val[i][j]=-1;
cout<<dp(k,n);
cout<<"\n";
}
signed main()
{
const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK,&rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK,&rl);
if (result != 0)
{
fprintf(stderr,"setrlimit returned result = %d\n",result);
}
}
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int _t=1;
cin>>_t;
for (int i=1;i<=_t;i++)
{
solve();
}
return 0;
}