微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的代码在本地计算机中出现段错误/stackoverflow 并在在线编译器中正确运行?

如何解决为什么我的代码在本地计算机中出现段错误/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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?