def pgc_memo(A):
    D = {}
    def carré(i, j):
        if (i, j) in D :
            return D[i, j]
        elif A[i][j] == 0 :
            res = 0
        else :
            if i == 0 or j == 0 :
                res = 1
            else :
                res = 1 + min(carré(i-1, j), carré(i, j-1), carré(i-1, j-1))
        D[(i, j)] = res
        return res
    for i in range(len(A)):
        for j in range(len(A[0])):
            carré(i, j)
    return D

