Encuentre el número total de arreglos distintos no decrecientes posibles

Dado el no exacto. de elementos que deben estar presentes en la matriz (let = r) y el valor máximo del último elemento de la matriz (let = n) encuentra el número total de matrices distintas no decrecientes posibles (todos los elementos de la matriz deben ser> = 0 )

Ejemplo: si r = 3 yn = 2, entonces algunas posibles matrices no decrecientes son {0,0,2}, {0,0,1}, {0,0,0}, {1,2,2} etc. Necesito el no. de este tipo de matrices posibles.

Traté de resolverlo usando recursividad y memorización, pero es demasiado lento.

aquí está mi código (ll significa largo largo) -

ll solve(ll i,ll curlevel)
{
    if(dp[i][curlevel]!=-1)
        return dp[i][curlevel];
    if(i<0)
        return dp[i][curlevel]=0;
    if(curlevel==r)
        return dp[i][curlevel]=1;
    if(curlevel>r)
        return dp[i][curlevel]=0;
    ll ans=0;
    for(ll k=i;k>=0;k--)
    {
        ans+= solve(k, curlevel+1);
    }
    return dp[i][curlevel]=ans;
}

Llamo a esta función de la siguiente manera.

for(ll i=n;i>=0;i--)
    {
        res+=solve(i, 1);
    }

Estoy buscando una forma más rápida de hacer esto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta