动态规划问题中的分段错误

我有一个问题需要解决,即需要找到最少的质数位数以形成等于给定数字N的数字。我选择了针对此问题的动态编程,但它遇到了分段错误(核心转储)消息。

long long sumOfOneDigitPrime(long long n)
{
    long long arr[n+1];
    long long i;
    for(i = 0; i <= n; i++)
    {
        arr[i] = 10000;
    }
    arr[0] = arr[2] = arr[3] = arr[5] = arr[7] = 1;
    for(i = 2; i <= n; i++)
    {
        if(i >= 2)
        {
            arr[i] = min(arr[i], 1+arr[i-2]);
        }
        if(i >= 3)
        {
            arr[i] = min(arr[i], 1+arr[i-3]);
        }
        if(i >= 5)
        {
            arr[i] = min(arr[i], 1+arr[i-5]);
        }
        if(i >= 7)
        {
            arr[i] = min(arr[i], 1+arr[i-7]);
        }
    }
    if(arr[n] == 10000)
        return -1;
    else
        return arr[n];
}

如您所见,这里的算法很明确,但我不知道为什么它会在这里出现分段错误(核心已转储)。在使用任何索引之前,请先进行检查。