使用std :: fill时出现分段错误

Pra*_*hal 0 c++ segmentation-fault

我试图运行以下代码,但它给我分段错误: -

#include <bits/stdc++.h>
using namespace std;
#define MAX 1000
int dp[MAX][MAX];

string s1, s2;

int lcs(int i, int j)
{
    int val;
    if ( i < 0 || j < 0)
        return 0;
    else if (dp[i][j] != -1)
    {
        return dp[i][j];
    }
    else
    {
        val =  max(lcs(i-1,j), lcs(i, j-1));
        if ( s1[i] == s2[j])
            val = max(lcs(i-1,j-1) + 1, val);
    }
    dp[i][j] = val;
    return val;
}

int main()
{
    int tc;
    scanf("%d", &tc);
    while (tc--)
    {
        fill(&dp[0][0], &dp[MAX][MAX], 0);
        cin>>s1;
        cin>>s2;
        printf("LCS = %d\n", lcs(s1.size()-1, s2.size()-1));
    }
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

现在,它正在给我一个分段错误,printf在while循环中的行.但是,如果我注释掉fill语句,则没有分段错误.
这可能是什么原因?

jag*_*ire 8

&dp[MAX][MAX]
Run Code Online (Sandbox Code Playgroud)

这引用了last-the-end数组的过去指针.你想要最后一个数组的过去指针,而不是:

&dp[MAX-1][MAX]
Run Code Online (Sandbox Code Playgroud)

否则它将迭代过去的数组,导致段错误.