Для разнообразия вот еще один ответ:
Определите minsq [i, j] как минимальное количество квадратов из {1 ^ 2, 2 ^ 2, ..., j ^ 2}, суммирующих до i. Тогда рекурсия:
minsq[i, j] = min(minsq[i - j*j, j] + 1, minsq[i, j - 1])
То есть, для вычисления minsq [i, j] мы либо используем j ^ 2, либо нет. Наш ответ для n таков:
minsq[n, floor(sqrt(n))]
Этот ответ, возможно, концептуально проще, чем представленный ранее, но с точки зрения кода это сложнее, так как нужно быть осторожным с базовыми вариантами. Временная сложность для обоих ответов асимптотически одинакова.