如何解决为什么我的代码在本地计算机中出现段错误/stackoverflow 并在在线编译器中正确运行?
我正在解决关于 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。