首页 > 解决方案 > 第一行的分段错误

问题描述

今天我正在解决一个问题,我编写了解决方案,我在第一行遇到了分段错误,我尝试了很多东西,但没有任何效果

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int ll;
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define INF 0x3f3f3f3f3f

ll dist(ll x1 , ll x2 , ll y1 , ll y2){

    ll x = (x1-x2)*(x1-x2);
    ll y = (y1-y2)*(y1-y2);

    return ( x+y );
}

int main() {

    fastio;

    ll n,m;
    ll a[1005][2];
    ll b[1005][2];
    ll dp[1005][1005][2];

    cin >> n >> m;
    for(ll i = 1; i <= n; i++) cin >> a[i][0] >> a[i][1];
    for(ll i = 1; i <= m; i++) cin >> b[i][0] >> b[i][1];



    for(ll i = 0; i <= n; i++) {
        for (ll j = 0; j <= m; j++) {
            dp[i][j][0] = INF;
            dp[i][j][1] = INF;
        }
    }

    dp[0][0][0] = 0;
    dp[0][0][1] = 0;
    dp[1][0][0] = 0;

    for(ll i = 1; i <= n; i++){
        for(ll j = 0; j <= m; j++){

            // dp[i][j][0] :
            if(i > 1) dp[i][j][0] = min(dp[i][j][0] , dp[i-1][j][0] + dist(a[i-1][0] , a[i][0] , a[i-1][1] , a[i][1]));
            if(i > 1 && j >= 1 ) dp[i][j][0] = min(dp[i][j][0] , dp[i-1][j][1] + dist(b[j-1][0] , a[i][0] , b[j-1][1] , a[i][1]));

            // dp[i][j][1] :

            if(j > 1 ) dp[i][j][1] = min(dp[i][j][1] , dp[i][j-1][0] + dist(a[j-1][0] , b[j][0] , a[j-1][1] , b[j][1]));
            if(j > 1 ) dp[i][j][1] = min(dp[i][j][1] , dp[i][j-1][1] + dist(b[j-1][0] , b[j][0] , b[j-1][1] , b[j][1]));

        }
    }

    cout << dp[n-1][m-1][0];

    return 0;
}

这是我的代码:https ://pastebin.com/MzbX2HPQ

请让我知道我应该改变什么?

谢谢 Sudheera YS

标签: c++segmentation-fault

解决方案


问题就在这里(我不会使用typedef,而是使用实际类型):

int main()
{
    long long a[1005][2];
    long long b[1005][2];
    long long dp[1005][1005][2];
    //...
}

由于这些数组是本地的main,因此需要有足够的堆栈内存来保存这些数组。如果我们假设它sizeof(long long)是 8,那么使用的总内存超过 16 兆字节。大多数编译器的默认堆栈大小小于 8 兆字节。

因此,为了防止这种情况,应该从堆中进行分配。这可以通过以下方式完成std::vector

#include <vector>
using Array1D = std::vector<long long>;
using Array2D = std::vector<Array1D>;
using Array3D = std::vector<Array2D>;

int main()
{
    Array2D a(1005, Array1D(2)) ;
    Array2D b(1005, Array1D(2)) ;
    Array3D dp(1005, Array2D(1005, Array1D(2)));
    //...
}

推荐阅读